Skip to content

Mapping

VladD2 edited this page Jul 8, 2016 · 5 revisions
syntax NamespaceMember
{
  ...
  | MapSyntax = "map" "syntax" RuleName=QualifiedReference ParametersOpt=MapSyntaxParameters? "->" AstName=NitraType MapSyntaxBody;
}

syntax MapSyntaxParameters = "(" (RuleMethodParam; ",")* ")";

syntax RuleMethodParam = Name ":" Type=NitraType;

syntax MapSyntaxBody
{
  | Empty       = ";"
  | Expression1 = "{" inl Expr=MapSyntaxExpression "}"
  | Expression2 = "->" Expr=MapSyntaxExpression
  | Inline      = "="  Code=MapSyntaxCode 
  | Extensions  = "{" Extensions=MapExtension+ "}"
    {
      syntax MapExtension = "|" Reference Body=MapSyntaxBody
    }
  | PerMember = "{" Members=MapSyntaxExpressionAstMember* "}"
}

syntax MapSyntaxExpressionAstMember
{
  | ParseTreeFieldExpressionMapping = Expr=MapSyntaxExpression sm "->" sm AstPropertyName=Reference ";" nl
  | ParseTreeFieldCodeMapping       = FieldName=Reference sm "=" sm Code=MapSyntaxCode nl
}

syntax MapSyntaxExpression
{
  | Braces     = "(" Expr=MapSyntaxExpression ")"
  | This       = "this"
  | Identifier = !(ReservedWords !IdentifierPartCharacters) Reference
  | Ast        = QualifiedReference "{" inl Members=MapSyntaxExpressionAstMember* "}"
  | List       = "[" (ItemExpr=MapSyntaxExpression; ",")* "]"
  | OptionSome = "Some" "(" ValueExpr=MapSyntaxExpression ")"
  | OptionNone = "None" "(" ")"
  | Match      = "match" "(" Expr=MapSyntaxExpression ")" "{" "|"? (MatchCase; "|")+ "}"
    {
      syntax MatchCase
      {
        | Inline = Pattern "=" Code=MapSyntaxCode
        | Expression = Pattern "->" Expr=MapSyntaxExpression
      }
    }

    | Fold = "fold" "(" ItemName=Name              "in" ItemExpr=MapSyntaxExpression
                    ";" AccumulatorName1=Name      "="  InitExpr=MapSyntaxExpression
                    ";" AccumulatorName2=Reference "="  EachExpr=MapSyntaxExpression
                    ")"

    | DefineVariable = "let" Name ":" NitraType "=" Expr=MapSyntaxExpression "in" Body=MapSyntaxExpression

    precedence TypeHint:
    | TypeHint = Expr=MapSyntaxExpression ":" NitraType

    precedence Call:
    | Call = Expr=MapSyntaxExpression "(" (ArgumentExpr=MapSyntaxExpression; ",")* ")"

    precedence MemberAccess:
    | MemberAccess = Expr=MapSyntaxExpression "." Reference
  }