grammar MinCaml; simple_exp: #simpleExp | LPAREN exp RPAREN #parenExp | LPAREN RPAREN #emptyParen | BOOL #boolExpr | INT #intExpr | FLOAT #floatExpr | IDENT #identExpr | simple_exp DOT LPAREN exp RPAREN #arrayGetExpr ; exp : #programExp | simple_exp #simpleExpInExp | NOT exp #notExp | MINUS exp #minusExp | MINUS_DOT exp #minusFloatExp | left = exp op = (AST_DOT | SLASH_DOT) right = exp #astSlashExp | left = exp op = (PLUS | MINUS | MINUS_DOT | PLUS_DOT) right = exp #addSubExp | left = exp op = (EQUAL | LESS_GREATER | LESS | GREATER | LESS_EQUAL | GREATER_EQUAL) right = exp #logicExp | IF condition = exp THEN thenExp = exp ELSE elseExp = exp #ifExp | LET IDENT EQUAL exp IN exp #letExp | LET REC fundef IN exp #letRecExp | exp actual_args #appExp | exp COMMA exp elems #tupleExp | LET LPAREN pat RPAREN EQUAL exp IN exp #tupleReadExp | simple_exp DOT LPAREN exp RPAREN LESS_MINUS exp #putExp | exp SEMICOLON exp #expSeqExp | ARRAY_CREATE simple_exp simple_exp #arrayCreateExp ; fundef: | IDENT formal_args EQUAL exp ; formal_args: | IDENT formal_args | IDENT ; actual_args: | actual_args simple_exp | simple_exp ; elems: | COMMA exp elems | ; pat: | pat COMMA IDENT | IDENT COMMA IDENT ; LET : 'let'; REC : 'rec'; IF : 'if'; THEN : 'then'; ELSE : 'else'; IN : 'in'; IDENT : '_' | [a-z][a-zA-Z0-9_]+; ARRAY_CREATE : 'Array.create'; LPAREN : '('; RPAREN : ')'; BOOL : 'true' 'false'; NOT : 'not'; INT : ['1'-'9'] (['0'-'9'])*; FLOAT : (['0'-'9'])+ ('.' (['0'-'9'])*)? (['e', 'E'] (['+', '-'])? (['0'-'9'])+)?; MINUS : '-'; PLUS : '+'; MINUS_DOT : '-.'; PLUS_DOT : '+.'; AST_DOT : '*.'; SLASH_DOT : '/.'; EQUAL : '='; LESS_GREATER : ''; LESS_EQUAL : '='; LESS : ''; DOT : '.'; LESS_MINUS : ' skip ; // toss out whitespace COMMENT : '(*' .*? '*)' -> skip;
但我看不出这两个规则中有任何空字符串的可能性。还是我错了?这个代码有什么问题?
exp
规则(实际上是每个规则)的第一行可能出现问题:
exp : #programExp
标准规则形式是
r: alt1 | alt2 | .... | altN ;
语法中的alt1
都为空。一个空的alt“匹配一个空字符串”。
我在ANTLR4中有以下语法 一切都很好.我在语法1中哪里错了?
我正在努力理解语法文件:https://github.com/antlr/grammars-v4/blob/master/url/url.g4 我无法理解运算符在最后的Character集合中:我知道代表不在集合运算符中,如:https://github.com/antlr/antlr4/blob/master/doc/lexer-rules.md即是匹配任何单个字符不在描述的集合中,但如何解释当
我想为转换为AST的文档定义一个超文本标记语言/Markdown之类的语法。我知道,ANTLR4不是做Markdown事情的最佳工具,但我更接近超文本标记语言方向。至少我认为我是。:) 这是我的lexer定义: 这是我的解析器定义: 我在ANTLRworks2和IntelliJ中使用ANTLR4插件尝试了这些东西。 我对列表和斜体规则有很多问题。在某些情况下匹配的方式很多,而在另一些情况下则没有匹