Skip to content

parser: add more places for identifier macro substitution #789

@AndreasKrall

Description

@AndreasKrall

There are some places in the grammar, where identifier should be replaced by identifierOrPlaceholder:

  formatField<out FormatField field>                            (. field = null; .)
  = identifier<out Identifier id>
    ( formatFieldRange<out field, id>

and

  relocationDefinition<out Definition def>    (. var startLocation = nextTokenLoc(); .)
  = RELOCATION
    identifier<out Identifier id>
    parameters<.out List<Parameter> params.>

and

  parameter<out Parameter param>
  = identifier<out Identifier name>
    SYM_COLON
    typeLiteral<out TypeLiteral type> (. param = new Parameter(name, type); .)
  .

  enumerationDefinition<out Definition def> (. var start = nextTokenLoc(); TypeLiteral enumType = null; .)
  = ENUMERATION
    identifierOrPlaceholder<out IdentifierOrPlaceholder id>
    [ SYM_COLON typeLiteral<out enumType> ]
    SYM_EQ                                  (. var entries = new ArrayList<EnumerationDefinition.Entry>(); .)
    SYM_BRACE_OPEN                          (. Expr value = null; .)
    identifier<out Identifier name>
    [
      SYM_EQ
      expression<out value, BIN_OPS>
    ]                                       (. entries.add(new EnumerationDefinition.Entry(name, value)); .)
    {                                       (. value = null; .)
      SYM_COMMA
      identifier<out name>
      [
        SYM_EQ
        expression<out value, BIN_OPS>
      ]                                     (. entries.add(new EnumerationDefinition.Entry(name, value)); .)
    }
    SYM_BRACE_CLOSE                         (. def = new EnumerationDefinition(id, enumType, entries, start.join(lastTokenLoc())); .)
  .

model and record definitions, but I do not know if there could be problems and

  importDefinition<out Definition def>     (. var start = nextTokenLoc(); var importPaths = new ArrayList<IsId>(); Identifier fileId = null; StringLiteral filePath = null; .)
  = IMPORT
    ( identifier<out fileId>
    | stringLiteral<out filePath>
    )                                      (. var segments = new ArrayList<Identifier>(); .)
    {
      IF (la.kind == _SYM_NAMESPACE && scanner.Peek().kind != _SYM_BRACE_OPEN)
      SYM_NAMESPACE
      identifier<out Identifier segment>   (. segments.add(segment); .)
    }                                      (. var symbolList = new ArrayList<List<Identifier>>(); .)
    [
      SYM_NAMESPACE
      SYM_BRACE_OPEN                       (. var list = new ArrayList<Identifier>(); .)
      identifier<out Identifier symbol>    (. list.add(symbol); .)
      {
        SYM_NAMESPACE
        identifier<out symbol>             (. list.add(symbol); .)
      }                                    (. symbolList.add(List.copyOf(list)); .)
      {
        SYM_COMMA                          (. list.clear(); .)
        identifier<out symbol>             (. list.add(symbol); .)
        {
          SYM_NAMESPACE
          identifier<out symbol>           (. list.add(symbol); .)
        }                                  (. symbolList.add(List.copyOf(list)); .)

later processTemplate when it is implemented, and

  applicationBinaryInterfaceDefinition<out Definition def> (. var start = nextTokenLoc(); .)
  = APPLICATION  BINARY INTERFACE
    identifier<out Identifier id>

and

  processorDefinition<out Definition def> (. var start = nextTokenLoc(); .)
  = PROCESSOR
    identifier<out Identifier id>
    IMPLEMENTS

and

  microArchitectureDefinition<out Definition def> (. var start = nextTokenLoc(); .)
  = MICRO ARCHITECTURE
    identifier<out Identifier id>
    IMPLEMENTS

and all the MiA elements and

  instructionCallStmt<out InstructionCallStatement statement> (. var start = nextTokenLoc(); var namedArguments = new ArrayList<InstructionCallStatement.NamedArgument>(); .)
  = identifierOrPlaceholder<out IdentifierOrPlaceholder id>
    [
      SYM_BRACE_OPEN
      identifier<out Identifier argName>
      SYM_EQ
      expression<out Expr argExpr, BIN_OPS>                   (. namedArguments.add(new InstructionCallStatement.NamedArgument(argName, argExpr)); .)
      {
        SYM_COMMA
        identifier<out argName>

and

  letStatement<out Statement letStatement> (. var start = nextTokenLoc(); var identifiers = new ArrayList<Identifier>(); .)
  = LET
    identifier<out Identifier id>       (. identifiers.add(id); .)
    {
      SYM_COMMA
      identifier<out Identifier nextId> (. identifiers.add(nextId); .)
    }

and

  forallStatement<out Statement forall> (. var start = nextTokenLoc(); var indices = new ArrayList<ForallIndex>(); TypeLiteral typeLiteral = null; .)
   = FORALL
    identifier<out Identifier indexName>
    [
    SYM_COLON
    typeLiteral<out  typeLiteral>
    ]
    SYM_IN
    rangeExpression<out Expr domain>    (. indices.add(new ForallIndex(indexName, typeLiteral, domain)); .)
    {
      SYM_COMMA
      identifier<out indexName>         (. typeLiteral = null; .)

and

  callOrBinaryExpression<out Expr expr, boolean allowLtOp, boolean allowWildcardArgs> (. expr = DUMMY_EXPR; .)
  = IF (isIdentifierToken(la) || isMacroReplacementOfType(this, BasicSyntaxType.SYM_EX))
    symbolOrBinaryExpression<out expr, allowLtOp>               (. List<CallIndexExpr.Arguments> argsIndices = new ArrayList<>(); .)
    {
      // Check if we received a symbol expression -> collect arguments
      // Otherwise, just return the collected binary expression
      IF (la.kind == _SYM_PAREN_OPEN && expr instanceof IsSymExpr)
      arguments<out CallIndexExpr.Arguments args, allowWildcardArgs>         (. argsIndices.add(args); .)
    }                                                           (. List<CallIndexExpr.SubCall> subCalls = new ArrayList<>(); .)
    {
      IF (la.kind == _SYM_DOT && expr instanceof IsSymExpr)
      SYM_DOT                                                   (. var subCallArgsIndices = new ArrayList<CallIndexExpr.Arguments>(); .)
      identifier<out Identifier id>

and

  letExpression<out Expr expr, boolean[] allowedOps>          (. var start = nextTokenLoc(); var identifiers = new ArrayList<Identifier>(); .)
  = LET
    identifier<out Identifier id>       (. identifiers.add(id); .)
    {
      SYM_COMMA
      identifier<out Identifier nextId> (. identifiers.add(nextId); .)

and

  macroDefinition<out ModelDefinition def>  (. var startLoc = nextTokenLoc(); .)
  = MODEL
    identifierOrPlaceholder<out IdentifierOrPlaceholder id>
    SYM_PAREN_OPEN                          (. var params = new ArrayList<MacroParam>(); .)
    [
      identifier<out Identifier paramId1>
      SYM_COLON
      syntaxType<out SyntaxType synType1>   (. params.add(new MacroParam(paramId1, synType1)); .)
      {
        SYM_COMMA
        identifier<out Identifier paramId2>

I don't know if on some places this could lead to problems.

Metadata

Metadata

Assignees

Labels

enhancementNew feature or requestfrontendThis is frontend relatedskip-changelogThis PR will not show up in the release changelog

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions