当前位置: 首页 > 知识库问答 >
问题:

antlr4中的mincaml语法

江烨伟
2023-03-14

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;

但我看不出这两个规则中有任何空字符串的可能性。还是我错了?这个代码有什么问题?

共有1个答案

曾元忠
2023-03-14

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插件尝试了这些东西。 我对列表和斜体规则有很多问题。在某些情况下匹配的方式很多,而在另一些情况下则没有匹