ANTLR 不匹配的输入 'NUM' 期望 {.... , 'NUM'}
ANTLR mismatched input 'NUM' expecting {.... , 'NUM'}
我在尝试解析文件时遇到 ANTLR4 问题。它首先起作用,但在将以下内容添加到我的语法后我得到一个错误(见下文):
TYPE_NUM: 'NUM';
mismatched input 'NUM' expecting {'LOAD', '\n', 'HEAR', 'NUM', 'STRING', 'COORD', 'BOOL', 'VOID', 'LIST'}
我的语言中的 'NUM' 关键字遵循以下规则:
typePrefix: type=('NUM' | 'BOOL' | 'STRING' | 'COORD' | 'LIST');
我的所有其他 typePrefixes 也有同样的问题,但我猜它对所有这些都是相同的解决方案。
我尝试用 TYPE_NUM、TYPE_BOOL 等替换 typePrefix 规则的所有选项,但似乎没有用。
编辑:
根据评论中的要求,我发布了我的语法部分,我在其中使用 'NUM':
prog
: roboDcl loads roboBodyDcl;
loads
: recursion=loads 'LOAD' '(' load_id=StringLit ')' '\n'
| //lambda
;
memberDcl
: dcl=fieldDcl
| met_dcl=methodDcl
| '\n'
;
roboDcl
: id=Identifier':''\n'
;
roboBodyDcl
: recursion=roboBodyDcl dcl=memberDcl
| dcl=memberDcl
;
fieldDcl
: t=typePrefix dcl_list=variableDclList '\n';
typePrefix
: type=('NUM' | 'BOOL' | 'STRING' | 'COORD' | 'LIST');
variableDclList
: single=variableDcl
| list=variableDclList ',' single=variableDcl
;
variableDcl
: var_init=variableInitializer
| id=Identifier '=' list_init=listInitializer
;
variableInitializer
: expr=assignmentExpression
;
TYPE_NUM: 'NUM';
TYPE_STRING: 'STRING';
TYPE_COORD: 'COORD';
TYPE_BOOL: 'BOOL';
TYPE_VOID: 'VOID';
TYPE_LIST: 'LIST';
如前所述,我尝试用以下内容替换 typePrefix 规则:
typePrefix
: type=(TYPE_NUM | TYPE_BOOL | TYPE_STRING | TYPE_COORD | TYPE_LIST);
我希望这就足够了,提前致谢!
我发现了问题,并会尽力提供解释,以防有人遇到同样的情况。
如前所述"The Definitive Antlr 4 Reference" ANTLR 通过选择首先定义的规则来解决词法分析器规则中的歧义。并指出 "That means your ID rule should be defined after all of your keyword rules..."
在我的例子中,我按以下方式定义了我的语法:
fragment NameStartChar
: 'A'..'Z' | 'a'..'z';
fragment NameChar
: NameStartChar
| Num
| '_'
;
fragment Num
: '0'..'9';
Identifier
: NameStartChar NameChar*;
TYPE_NUM: 'NUM';
这最终匹配了我的所有关键字 'NUM'、'BOOL' 等等。
因此,解决方案是将标识符规则定义为词法分析器规则的最后一个。可以在下面看到一个示例:
fragment NameStartChar
: 'A'..'Z' | 'a'..'z';
fragment NameChar
: NameStartChar
| Num
| '_'
;
fragment Num
: '0'..'9';
TYPE_NUM: 'NUM';
//All other keyword definitions ('BOOL', 'STRING' and so alike)
Identifier
: NameStartChar NameChar*
我在尝试解析文件时遇到 ANTLR4 问题。它首先起作用,但在将以下内容添加到我的语法后我得到一个错误(见下文):
TYPE_NUM: 'NUM';
mismatched input 'NUM' expecting {'LOAD', '\n', 'HEAR', 'NUM', 'STRING', 'COORD', 'BOOL', 'VOID', 'LIST'}
我的语言中的 'NUM' 关键字遵循以下规则:
typePrefix: type=('NUM' | 'BOOL' | 'STRING' | 'COORD' | 'LIST');
我的所有其他 typePrefixes 也有同样的问题,但我猜它对所有这些都是相同的解决方案。
我尝试用 TYPE_NUM、TYPE_BOOL 等替换 typePrefix 规则的所有选项,但似乎没有用。
编辑: 根据评论中的要求,我发布了我的语法部分,我在其中使用 'NUM':
prog
: roboDcl loads roboBodyDcl;
loads
: recursion=loads 'LOAD' '(' load_id=StringLit ')' '\n'
| //lambda
;
memberDcl
: dcl=fieldDcl
| met_dcl=methodDcl
| '\n'
;
roboDcl
: id=Identifier':''\n'
;
roboBodyDcl
: recursion=roboBodyDcl dcl=memberDcl
| dcl=memberDcl
;
fieldDcl
: t=typePrefix dcl_list=variableDclList '\n';
typePrefix
: type=('NUM' | 'BOOL' | 'STRING' | 'COORD' | 'LIST');
variableDclList
: single=variableDcl
| list=variableDclList ',' single=variableDcl
;
variableDcl
: var_init=variableInitializer
| id=Identifier '=' list_init=listInitializer
;
variableInitializer
: expr=assignmentExpression
;
TYPE_NUM: 'NUM';
TYPE_STRING: 'STRING';
TYPE_COORD: 'COORD';
TYPE_BOOL: 'BOOL';
TYPE_VOID: 'VOID';
TYPE_LIST: 'LIST';
如前所述,我尝试用以下内容替换 typePrefix 规则:
typePrefix
: type=(TYPE_NUM | TYPE_BOOL | TYPE_STRING | TYPE_COORD | TYPE_LIST);
我希望这就足够了,提前致谢!
我发现了问题,并会尽力提供解释,以防有人遇到同样的情况。
如前所述"The Definitive Antlr 4 Reference" ANTLR 通过选择首先定义的规则来解决词法分析器规则中的歧义。并指出 "That means your ID rule should be defined after all of your keyword rules..."
在我的例子中,我按以下方式定义了我的语法:
fragment NameStartChar
: 'A'..'Z' | 'a'..'z';
fragment NameChar
: NameStartChar
| Num
| '_'
;
fragment Num
: '0'..'9';
Identifier
: NameStartChar NameChar*;
TYPE_NUM: 'NUM';
这最终匹配了我的所有关键字 'NUM'、'BOOL' 等等。
因此,解决方案是将标识符规则定义为词法分析器规则的最后一个。可以在下面看到一个示例:
fragment NameStartChar
: 'A'..'Z' | 'a'..'z';
fragment NameChar
: NameStartChar
| Num
| '_'
;
fragment Num
: '0'..'9';
TYPE_NUM: 'NUM';
//All other keyword definitions ('BOOL', 'STRING' and so alike)
Identifier
: NameStartChar NameChar*