Пример #1
0
/// ParseDesignator - Parse a designator. Return null if current token is not a
/// designator.
///
///   [R601]:
///     designator :=
///         object-name
///      or array-element
///      or array-section
///      or coindexed-named-object
///      or complex-part-designator
///      or structure-component
///      or substring
///
/// FIXME: substring for a character array
ExprResult Parser::ParseDesignator(bool IsLvalue) {
  auto E = ParseNameOrCall();

  struct ScopedFlag {
    bool value;
    bool &dest;

    ScopedFlag(bool &flag) : dest(flag) {
      value = flag;
    }
    ~ScopedFlag() {
      dest = value;
    }
  };

  ScopedFlag Flag(DontResolveIdentifiers);
  if(DontResolveIdentifiersInSubExpressions)
    DontResolveIdentifiers = true;

  while(true) {
    if(!E.isUsable())
      break;
    if(IsPresent(tok::l_paren)) {
      auto EType = E.get()->getType();
      if(EType->isArrayType())
        E = ParseArraySubscript(E);
      else if(EType->isCharacterType())
        E = ParseSubstring(E);
      else {
        Diag.Report(Tok.getLocation(), diag::err_unexpected_lparen);
        return ExprError();
      }
    } else if(IsPresent(tok::percent)) {
      auto EType = E.get()->getType();
      if(EType->isRecordType())
        E = ParseStructureComponent(E);
      else {
        Diag.Report(Tok.getLocation(), diag::err_unexpected_percent);
        return ExprError();
      }
    } else if(IsPresent(tok::period)) {
      auto EType = E.get()->getType();
      if(EType->isRecordType())
        E = ParseStructureComponent(E);
      else {
        Diag.Report(Tok.getLocation(), diag::err_unexpected_period);
        return ExprError();
      }
    }
    else break;
  }

  return E;
}
Пример #2
0
bool MdsEditView::isRecord(QListViewItem *item) const
{
  QListViewItem *parent = item->parent();
  if (!parent) return false;

  return isRecordType(parent);
}
Пример #3
0
void MdsEditView::slotSelectionChanged(QListViewItem *item)
{
  QString path = buildRecordPath(item);
  statusBar()->message(path);

  refreshListView();

  newRecordAction->setEnabled(isRecordType(item));
}
Пример #4
0
RValueTy CodeGenFunction::EmitRValue(const Expr *E) {
  auto EType = E->getType();
  if(EType->isComplexType())
    return EmitComplexExpr(E);
  else if(EType->isCharacterType())
    return EmitCharacterExpr(E);
  else if(EType->isLogicalType())
    return EmitLogicalValueExpr(E);
  else if(EType->isRecordType())
    return EmitAggregateExpr(E);
  else
    return EmitScalarExpr(E);
}
Пример #5
0
 std::string visitType(const Type &type) const {
     std::string str;
     if(isNumberType(type)) {
         str="i:"+type.getName();
     } else if(isSymbolType(type)) {
         str="s:"+type.getName();
     } else if(isRecordType(type)) {
         str="r:"+type.getName();
     } else {
         ASSERT(false && "unknown type class"); 
     } 
     seen[&type] = str;
     return str; 
 }