繁体   English   中英

输入不匹配的antlr4错误解释

[英]Mismatched input antlr4 misinterpreting

我被大学的编译器项目困住了,无法解析以下输入

haupt() {
    while(i==2) {
        (5+2)*3
        }
}

这个语法:

grammar Demo;

@header {
    import java.util.List;
    import java.util.ArrayList;
}

program:
    functionList
    ;

functionList:
    function*
    ;

function:
    'haupt()' '{' stmntList '}'                 #haupt
    |'Integer' ID '(' paramList ')' '{' stmntList '}'   #integerFunction
    | 'String' ID '(' paramList ')' '{' stmntList '}'   #stringFunction
    | 'void' ID '(' paramList ')' '{' stmntList '}'     #voidFunction
    ;

paramList:
    param (',' paramList)?
    ;

param:
    'Integer' ID                                        
    | 'String' ID                                       
    ;

variableList:
    ID (',' variableList)?
    ;


stmntList:
    stmnt (stmntList)?                                      
    ;

stmnt:
    'Integer' ID ';'                                                        #integerStmnt
    | 'String' ID   ';'                                                     #stringStmnt
    |  ID '=' expr  ';'                                                     #varAssignment
    | 'print''(' ID ')'     ';'                                             #printText
    | 'toString' '(' ID ')'';'                                              #convertString
    | 'toInteger''('ID')'';'                                                #convertInteger
    | 'if' '(' boolExpr ')' '{' stmntList '}'  ('else' '{' stmntList '}')?  #elseStmnt  
    | 'for' '(' ID '=' expr ',' boolExpr ',' stmnt ')' '{' stmntList '}'    #forLoop    
    | 'while' '(' boolExpr ')' '{' stmntList '}'                            #whileLoop
    | 'do' '{' stmntList '}' 'while' '(' boolExpr ')'   ';'                 #doWhile
    | 'return' expr             ';'                                         #returnVar
    | ID '(' variableList ')'';'                                            #functionCall               
    ;

boolExpr:
    boolParts ('&&' boolExpr)?                  #logicAnd
    | boolParts ('||' boolExpr)?                #logicOr
    ;

boolParts:
    expr '==' expr                      #isEqual
    | expr '!=' expr                    #isUnequal
    | expr '>' expr                     #biggerThan
    | expr '<' expr                     #smallerThan
    | expr '>=' expr                    #biggerEqual
    | expr '<=' expr                    #smallerEqual
    ;

expr:
    links=expr '+' rechts=product                   #addi
    | links = expr '-' rechts=product               #diff
    |product                            #prod
    ;

product:
    links=product '*' rechts=factor                 #mult
    | links=product '/' rechts=factor               #teil
    | factor                            #fact
    ;

factor:
    '(' expr')'                         #bracket
    | ID                                #var
    | zahl=NUMBER                           #numb
    ;


ID  :       [a-zA-Z]*;
NUMBER  :   '0'|[1-9][0-9]*;
WS:         [\r\n\t ]+ -> skip ;

因为我收到以下错误消息:

line 1:5: mismatched input '(' expecting {<EOF>, '-', '*', '+', '/'}

我认为antlr会误解输入内容,并认为“ haupt”是ID,而不是功能的第一规则。 怎么会这样 我一直以为antlr使用第一个规则匹配?

谢谢你的帮助!

我会按建议使用'haupt''(('')',但'haupt()'应该匹配。 实际上确实如此。 我得到的错误在第3行。语句中的所有内容都不匹配(5 + 2)* 3。

我收到另一个错误:

line 3:8 no viable alternative at input '('

我可以解释一下:(5 + 2)* 3不是语句(正如Ter指出的那样)。

您似乎使用了奇怪的ANTLR版本...

您还应该注意以下警告:

warning(146): Path\To\File\Demo.g4:95:0: non-fragment lexer rule 'ID' can match the empty string

这告诉您,空字符串也将是一个标识符(在大多数情况下不是您想要的)。 *更改为+帮助...

关于您的评论

它对我来说效果很好(请注意,ID规则与您的版本相比已稍有更改,但它也适用于您的版本)。

如果您查看令牌类型( <>的数字),您会发现printabc (即ID )的类型是不同的(17( 'print' )和33( ID ))。

语法:

grammar Demo;

@header {
    import java.util.List;
    import java.util.ArrayList;
}

program:
    functionList
    ;

functionList:
    function*
    ;

function:
    'haupt()' '{' stmntList '}'                 #haupt
    |'Integer' ID '(' paramList ')' '{' stmntList '}'   #integerFunction
    | 'String' ID '(' paramList ')' '{' stmntList '}'   #stringFunction
    | 'void' ID '(' paramList ')' '{' stmntList '}'     #voidFunction
    ;

paramList:
    param (',' paramList)?
    ;

param:
    'Integer' ID
    | 'String' ID
    ;

variableList:
    ID (',' variableList)?
    ;


stmntList:
    stmnt (stmntList)?
    ;

stmnt:
    'Integer' ID ';'                                                        #integerStmnt
    | 'String' ID   ';'                                                     #stringStmnt
    |  ID '=' expr  ';'                                                     #varAssignment
    | 'print''(' ID ')'     ';'                                             #printText
    | 'toString' '(' ID ')'';'                                              #convertString
    | 'toInteger''('ID')'';'                                                #convertInteger
    | 'if' '(' boolExpr ')' '{' stmntList '}'  ('else' '{' stmntList '}')?  #elseStmnt
    | 'for' '(' ID '=' expr ',' boolExpr ',' stmnt ')' '{' stmntList '}'    #forLoop
    | 'while' '(' boolExpr ')' '{' stmntList '}'                            #whileLoop
    | 'do' '{' stmntList '}' 'while' '(' boolExpr ')'   ';'                 #doWhile
    | 'return' expr             ';'                                         #returnVar
    | ID '(' variableList ')'';'                                            #functionCall
    ;

boolExpr:
    boolParts ('&&' boolExpr)?                  #logicAnd
    | boolParts ('||' boolExpr)?                #logicOr
    ;

boolParts:
    expr '==' expr                      #isEqual
    | expr '!=' expr                    #isUnequal
    | expr '>' expr                     #biggerThan
    | expr '<' expr                     #smallerThan
    | expr '>=' expr                    #biggerEqual
    | expr '<=' expr                    #smallerEqual
    ;

expr:
    links=expr '+' rechts=product                   #addi
    | links = expr '-' rechts=product               #diff
    |product                            #prod
    ;

product:
    links=product '*' rechts=factor                 #mult
    | links=product '/' rechts=factor               #teil
    | factor                            #fact
    ;

factor:
    '(' expr')'                         #bracket
    | ID                                #var
    | zahl=NUMBER                           #numb
    ;


ID  :       [a-zA-Z]+;
NUMBER  :   '0'|[1-9][0-9]*;
WS:         [\r\n\t ]+ -> skip ;

测试文件:

haupt() {
    while(i==2) {
        print(abc);
        }
}

结果:

[@0,0:6='haupt()',<18>,1:0]
[@1,8:8='{',<9>,1:8]
[@2,14:18='while',<6>,2:4]
[@3,19:19='(',<20>,2:9]
[@4,20:20='i',<33>,2:10]
[@5,21:22='==',<25>,2:11]
[@6,23:23='2',<34>,2:13]
[@7,24:24=')',<30>,2:14]
[@8,26:26='{',<9>,2:16]
[@9,36:40='print',<17>,3:8]
[@10,41:41='(',<20>,3:13]
[@11,42:44='abc',<33>,3:14]
[@12,45:45=')',<30>,3:17]
[@13,46:46=';',<7>,3:18]
[@14,56:56='}',<13>,4:8]
[@15,58:58='}',<13>,5:0]
[@16,59:58='<EOF>',<-1>,5:1]
(program (functionList (function haupt() { (stmntList (stmnt while ( (boolExpr (boolParts (expr (product (factor i))) == (expr (product (factor 2))))) ) { (stmntList (stmnt print ( abc ) ;)) })) })))

解析树

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM