[英]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规则与您的版本相比已稍有更改,但它也适用于您的版本)。
如果您查看令牌类型( <>
的数字),您会发现print
和abc
(即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.