我正在使用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'
答案 0 :(得分:0)
我的语法遇到了同样的问题,我用它周围的“包装”修复了它......
wrapper
: programm EOF
;
答案 1 :(得分:0)
问题是我调用了两次visitor.program()所以我需要加倍输入。