2016-02-17 97 views
0

我使用ANTLR 4(4.5.1)创建解析器,然后执行语义验证,但在测试解析器时出现EOF错误。ANTLR 4中不匹配的EOF

这是错误

linea 8:0 at [@10,49:48='<EOF>',<-1>,8:0]: mismatched input '<EOF>' expecting 'class' 

这是我的输入文件。

class Program { 

    int z; 
    int c; 
} 

我用来解决这个错误的解决方法是重复整个输入文件中是这样的:我不明白为什么下面的作品,也许是OSX的问题。

class Program { 

     int z; 
     int c; 
    } 
class Program { 

     int z; 
     int c; 
    } 

我不想再这么做了,有人知道发生了什么吗?

这是我的语法

grammar program; 

//*********************LEXER SPECIFICATION ************** 
STRUCT : 'struct' ; 
TRUE : 'true' ; 
FALSE : 'false' ; 
VOID : 'void' ; 
IF :  'if' ; 
ELSE : 'else' ; 
WHILE : 'while' ; 
RETURN : 'return' ; 
INT :  'int' ; 
CHAR : 'char' ; 
BOOLEAN : 'boolean' ; 

fragment LETTER : ('a'..'z'|'A'..'Z') ; 
fragment DIGIT :'0'..'9' ; 
fragment ASCII : (' ' ..'~') | '\\' | '\'' | '\"' | '\t' | '\n' ; 
//* \' 
ID : LETTER (LETTER | DIGIT)* ; 
NUM : DIGIT (DIGIT)* ; 
Char : '\'' ASCII '\''; 


WS : 
    [\t\r\n\f ]+ -> skip 
    ; 

COMMENT 
    : ('//' ~[\r\n]* '\r'? '\n' 
     | '/*' .*? '*/'   
     ) -> skip 
    ;        

//************** PARSER SPECIFICATION ************** 

program 
    : 'class' 'Program' '{' (declaration)* '}' 
    ; 

declaration 
    : structDeclaration #declarationStructDeclaration 
    | varDeclaration  #declarationVarDeclaration 
    | methodDeclaration #declarationMethodDeclaration 
    ; 
varDeclaration 
    : varType ID ';'    #varDeclarationID 
    | varType ID '[' NUM ']' ';' #varDeclarationArray 
    ; 

varDeclarationStruct 
    : varType ID ';'   #varDeclarationStructID 
    | varType ID '[' NUM ']' ';' #varDeclarationStructArray 
    ; 

structDeclaration 
    : STRUCT ID '{' (varDeclarationStruct)* '}' 
    ; 

varType      #varType 
    : INT     #varTypeInt 
    | CHAR    #varTypeChar 
    | BOOLEAN    #varTypeBoolean 
    | STRUCT ID   #varTypeStruct 
    | structDeclaration #varTypeStructDeclaration 
    | VOID    #varTypeVoid 
    ; 

methodDeclaration 
    : methodType ID '(' (params |) ')' block 
    ; 


params 
    : params ',' parameter #paramsParameterWithComma 
    | parameter  #paramsParameter 
    ; 

methodType 
    : INT    #methodTypeInt 
    | CHAR    #methodTypeChar 
    | BOOLEAN    #methodTypeBoolean 
    | VOID    #methodTypeVoid 
    ; 

parameter 
    : parameterType ID  #parameterID 
    | parameterType ID '[' NUM ']' #parameterArray 
    ; 

parameterType 
    : INT     #parameterTypeInt 
    | CHAR    #parameterTypeChar 
    | BOOLEAN    #parameterTypeBoolean 
    ; 


block 
    : '{' (varDeclaration | statement)* '}' 
    ; 

statement 
    : IF '(' expression ')' block (ELSE block)? #statementIF 
    | WHILE '(' expression ')' block   #statementWhile 
    | 'return' (expression |) ';'   #statementReturn 
    | methodCall ';'     #statementMethodCall 
    | block      #statementBlock    
    | location '=' expression ';'   #statementLocation 
    | (expression)?';'    #statementExpression 
    ; 

location 
    : (ID | ID '[' expression ']') ('.' locationMember)? 
    ; 

locationMember 
    : (ID | ID '[' expression ']')('.' locationMember)? 
    ; 


expression 
    : andExpr    #expressionAndExpr 
    | expression cond_op_or andExpr #expressionCondOpOr 
    ; 

andExpr 
    : eqExpr    #andExprEqExpr 
    | andExpr cond_op_and eqExpr #andExprCondOpAnd 
    ; 

eqExpr 
    : relationExpr   #eqExprRelationExpr 
    | eqExpr eq_op relationExpr #eqExprEqOp 
    ; 

relationExpr 
    : addExpr    #relationExprAddExpr 
    | relationExpr rel_op addExpr  #relationExprRelOp 
    ; 


addExpr 
    : multExpr   #addExprMultExpr 
    | addExpr minusplus_op multExpr #addExprMinusPlusOp 
    ; 

multExpr 
    : unaryExpr   #multExprUnary 
    | multExpr multdiv_op unaryExpr #multExprMultDivOp 
    ; 


unaryExpr 
    : '('(INT|CHAR)')' value  #unaryExprCast 
    | '-' value   #unaryExprMinus 
    | '!' value   #unaryExprNot 
    | value    #unaryExprOther 
    ; 

value 
    : location   #valueLocation 
    | methodCall   #valueMethodCall 
    | literal    #valueLiteral 
    | '(' expression ')'  #valueExprWithParent 
    ; 



methodCall 
    : ID '(' (arg (',' arg)*)? ')' 
    ; 

arg 
    : expression 
    ; 


minusplus_op  
    : '+' 
    | '-' 
    ; 

multdiv_op 
    : '*' 
    | '/' 
    | '%' 
    ; 

powmod_op 
    : '%' 
    ; 

rel_op 
    : '<' 
    | '>' 
    | '<=' 
    | '>=' 
    ; 

eq_op 
    : '==' 
    | '!=' 
    ; 

cond_op_or : '||'; 
cond_op_and: '&&'; 

literal 
    : int_literal 
    | char_literal 
    | bool_literal 
    ; 

int_literal 
    : NUM 
    ; 

char_literal 
    : Char 
    ; 

bool_literal 
    : 'true' 
    | 'false' 
    ; 

编辑###########

我使用NetBeans插件ANTLR的作品,它是编译与4.4版本的语法我正在使用jar 4.5.1,所以我只收到警告。我试图与4.5.1版本来编译它,现在我收到的错误是这样的:

mismatched input 'class' expecting <EOF> 

这发生在我重复输入。如果我没有复制它,我会收到这个问题的第一个错误。

mismatched input '<EOF>' expecting 'class' 

回答

0

的问题是,我打电话两次visitor.program()所以我需要加倍输入。

0

,我与我的语法同样的问题,我用“包装”固定它周围...

wrapper 
    : programm EOF 
    ; 
+0

我仍然得到错误:( – fcpauldiaz

+0

是PROGRAMM您开始规则如果是试图将其更改为'程序 :“类”“计划”“{”(声明)*“}” EOF ;' – Bruno

+0

程序是我的开始规则,我刚刚尝试过,但仍然有相同的错误。 – fcpauldiaz