我使用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'
我仍然得到错误:( – fcpauldiaz
是PROGRAMM您开始规则如果是试图将其更改为'程序 :“类”“计划”“{”(声明)*“}” EOF ;' – Bruno
程序是我的开始规则,我刚刚尝试过,但仍然有相同的错误。 – fcpauldiaz