我被困我compilerproject的大學和有麻煩解析下面輸入不匹配的輸入antlr4曲解
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使用第一個規則匹配?
感謝您的幫助!
我不知道這是否是你的問題,但我有從來沒有見過一個語法befor e括號是關鍵字的一部分,如'haupt()'中所示,同時也可以在其他地方作爲單獨的標記使用。也許試試'haupt''('')'而不是'haupt()'? –