ANTLR 4中的EOF不匹配

时间:2016-02-17 04:52:09

标签: java antlr antlr4

我正在使用ANTLR 4(4.5.1)创建解析器,然后进行语义验证,但在测试解析器时出现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'
    ;

EDIT ###########

我正在使用netbeans插件ANTLR工作,它正在编译4.4版本的语法,我正在使用jar 4.5.1,所以我只收到警告。我尝试使用4.5.1版本编译它,现在我收到的错误是:

mismatched input 'class' expecting <EOF>

当我复制输入时会发生这种情况。如果我不复制它,我会收到此问题的第一个错误。

mismatched input '<EOF>' expecting 'class'

2 个答案:

答案 0 :(得分:0)

我的语法遇到了同样的问题,我用它周围的“包装”修复了它......

wrapper
  : programm EOF
  ;

答案 1 :(得分:0)

问题是我调用了两次visitor.program()所以我需要加倍输入。