Monte GrammarΒΆ
Note
Lexical details such as indented blocks are not captured in this grammar.
Todo
finish grammar productions marked @@. Meanwhile, see monte_parser.mt for details.
blockExpr ::=FunctionExpr|ObjectExpr|bind|def|InterfaceExpr|IfExpr|ForExpr|WhileExpr|SwitchExpr|EscapeExpr|TryExpr|WhenExpr|LambdaExpr|MetaExprblock ::= "{" (sequence| "pass" ) "}" HideExpr ::= "{" ((expr";" )+ | /* empty */) "}" IfExpr ::= "if" "("expr")"block[ "else" ( "if" /* blockExpr@@ */ |block)] SwitchExpr ::= "switch" "("expr")" "{"matchers"}" matchers ::= ( "match"patternblock)+ TryExpr ::= "try"blockcatcherscatchers ::= [( "catch"patternblock)+ ] [ "finally"block] EscapeExpr ::= "escape"patternblockCatchWhileExpr ::= "while" "("expr")"blockCatchForExpr ::= "for"pattern[ "=>"pattern] "in"compblockCatchblockCatch ::=block[ "catch"patternblock] WhenExpr ::= "when" "(" (expr"," )+ ")" "->"blockcatchersLambdaExpr ::= "fn" [(pattern"," )+ ]blockdef ::= "def" ( ( "bind"name[guard] |name) (/* objectFunction@@ */ |assign) |assign) bind ::= "bind"name[guard]objectExprObjectExpr ::= "object" ( "bind"name| "_" |name)objectExprobjectExpr ::= [ "extends"order]auditors"{" [(objectScript";" )+ ] "}" objectScript ::= [doco] ("pass" | [("@@meth" )+ ] ) ("pass" | [(matchers)+ ] ) matchers ::= ( "match"patternblock)+ doco ::= .String. FunctionExpr ::= "def" [ "."verb] "(" [(pattern"," )+ ] ")"blockInterfaceExpr ::= "interface"namePatt[ "guards"pattern] [ "extends" (order"," )+ ] /* implements_@@ */ /* msgs@@ */ guardOpt ::= ":"guard| /* empty */ guard ::= IDENTIFIER "[" ((expr"," )+ | /* empty */) "]" | IDENTIFIER | "("expr")" module_header ::= "imports"StrExpr"=~" ((pattern)+ ) [exports]sequenceexports ::= "exports" "(" ((name"," )+ | /* empty */) ")" sequence ::= ((blockExpr|expr) ";" )+ | /* empty */ assign ::= "def"pattern[ "exit"order] ":="assign| (VarPatt|BindPatt) /* empty */ ":="assign|lval":="assign|VerbAssignExpr|orderlval ::=order"[" ((expr"," )+ | /* empty */) "]" |nameVerbAssignExpr ::=lvalVERB_ASSIGNassignlogical_or ::=logical_and[ "||"logical_or] logical_and ::=comp[ "&&"logical_and] comp ::=order(("=~" | "!~" ) | ("==" | "!=" ) | "&!" | ("^" | "&" | "|" ))comp|orderorder ::=CompareExpr|RangeExpr|BinaryExpr|prefixCompareExpr ::=prefix(">" | "<" | ">=" | "<=" | "<=>" )orderRangeExpr ::=prefix(.. | ..!)ordershift ::=prefix("<<" | ">>" )orderadditiveExpr ::=multiplicativeExpr("+" | "-" )additiveExprmultiplicativeExpr ::=exponentiationExpr("*" | "/" | "//" | "%" )orderexponentiationExpr ::=prefix"**"orderprefix ::= "-"prim| ("~" | "!" )calls|SlotExpr|BindingExpr|CoerceExpr|callsSlotExpr ::= "&"nameBindingExpr ::= "&&"nameMetaExpr ::= "meta" . ( "context" "(" ")" | "getState" "(" ")" ) CoerceExpr ::=calls":"guardcalls ::=prim((( (call|send) |index) )+ ) [curryTail] call ::= [ .verb]argListsend ::= "<-" [verb]argListcurryTail ::= .verb| "<-"verbindex ::= "[" ((expr"," )+ | /* empty */) "]" verb ::= IDENTIFIER | .String. argList ::= "(" ((expr"," )+ | /* empty */) ")" pattern ::=postfixPattpostfixPatt ::=SuchThatPatt|prefixPattprefixPatt ::=MapPatt|ListPatt|SamePatt|NotSamePatt|QuasiliteralPatt|ViaPatt|IgnorePatt|namePattnamePatt ::=FinalPatt|VarPatt|BindPatt|SlotPatt|BindingPattSuchThatPatt ::=prefixPatt"?" "("expr")" ListPatt ::= "[" ((pattern"," )+ | /* empty */) "]" [ "+"pattern] MapPatt ::= "[" (mapPattItem"," )+ "]" [ "|"pattern] mapPattItem ::= ( (LiteralExpr| "("expr")" ) "=>"pattern| "=>"namePatt) [ ":="order] SamePatt ::= "=="primNotSamePatt ::= "!="primQuasiliteralPatt ::= [IDENTIFIER] "`" ((( QUASI_TEXT | ( AT_IDENT | "@{"pattern"}" )) )+ ) "`" ViaPatt ::= "via" "("expr")"patternFinalPatt ::=nameguardOptVarPatt ::= "var"nameguardOptBindPatt ::= "bind"nameguardOptSlotPatt ::= "&"nameguardOptBindingPatt ::= "&&"nameIgnorePatt ::= "_"guardOptprim ::= "("expr")" |LiteralExpr|quasiliteral|NounExpr|HideExpr|MapComprehensionExpr|ListComprehensionExpr|ListExpr|MapExprexpr ::=assign| ("continue" | "break" | "return" ) ( "(" ")" | ";" |blockExpr) NounExpr ::=namename ::= IDENTIFIER | "::"stringLiteralLiteralExpr ::=StrExpr|IntExpr|DoubleExpr|CharExprquasiliteral ::= [IDENTIFIER] "`" ((( QUASI_TEXT | ( DOLLAR_IDENT | "${"expr"}" )) )+ ) "`" ListExpr ::= "[" ((expr"," )+ | /* empty */) "]" comprehension ::=pattern"in"iterexpr|pattern"=>"pattern"in"iterexpr"=>"expriter ::=order[ "if"comp] MapExpr ::= "[" (mapItem"," )+ "]" mapItem ::=expr"=>"expr| "=>" (SlotExpr|BindingExpr|NounExpr) IntExpr ::= (hexLiteral|decLiteral) decLiteral ::=digitsdigits ::=digit(((digit| "_" ) )+ )+ digit ::= /* one of: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 */ hexLiteral ::= "0" ("x" | X)hexDigitshexDigits ::=hexDigit(((hexDigit| "_" ) )+ )+ hexDigit ::= /* one of: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, A, B, C, D, E, F */ DoubleExpr ::=floatLiteralfloatLiteral ::=digits( .digits[floatExpn] |floatExpn) floatExpn ::= /* one of: e, E */ [ /* one of: -, + */ ]digitsCharExpr ::= "'"charConstant"'" charConstant ::= (( "\" /* newline */ )+ )+ (/* none of: ', \, tab */ | "\" ( ( U /* 8 x */hexDigit| "u" /* 4 x */hexDigit| "x" /* 2 x */hexDigit) | /* one of: b, t, n, f, r, \, ', " */ )) StrExpr ::=stringLiteralstringLiteral ::= '"' ((charConstant)+ )+ '"'