ANTLR4 输入时没有可行的替代方案
ANTLR4 No Viable Alternative At Input
我正在使用 ANTLR4 实现一个简单的伪代码语言,这是我当前的语法:
// Define a grammar called PseudoCode
grammar PseudoCode;
prog : FUNCTION SIGNATURE '(' ')'
| FUNCTION SIGNATURE '{' VARB '}' ;
param: VARB | VARB ',' param ;
assignment: VARB '=' NUMBER ;
FUNCTION: 'function' ;
VARB: [a-z0-9]+ ;
SIGNATURE: [a-zA-Z0-9]+ ;
NUMBER: [0-9]+ | [0-9]+ '.' [0-9]+ ;
WS: [ \t\r\n]+ -> skip ;
问题是在编译和生成解析器、词法分析器等之后...然后 运行 grun PseudoCode prog -tree
输入例如:function bla{bleh}
我不断收到以下错误:
line 1:9 no viable alternative at input 'functionbla'
有人能指出我的语法有什么问题吗?
bla
是 VARB
,而不是 SIGNATURE
,因为它匹配两个规则并且 VARB
在语法中排在第一位。按照您定义词法分析器规则的方式,如果标识符包含大写字母,则它只能匹配为 SIGNATURE
。
解决此问题的最简单方法是为标识符设置一个词法分析器规则,然后在您当前使用 SIGNATURE
或 VARB
的任何地方使用它。如果你想在某些地方禁止大写字母,你可以简单地在一个动作或监听器中检查这个条件,这也可以让你产生比语法错误更清晰的错误消息(例如 "capital letters are not allowed in variable names")。
如果您绝对确实需要变量名中的大写字母作为语法错误,您可以为带有大写字母的标识符定义一种规则,另一种不使用大写字母。然后你可以在你想要允许两者的地方使用 ID_WITH_CAPITALS | ID_LOWER_CASE_ONLY
和 ID_LOWER_CASE_ONLY
在你只想允许小写字母的情况下。
PS:您还需要确保您的标识符规则不匹配数字(VARB
和 SIGNATURE
目前都匹配)。目前 NUMBER
代币只会为带小数点的数字生成。
我正在使用 ANTLR4 实现一个简单的伪代码语言,这是我当前的语法:
// Define a grammar called PseudoCode
grammar PseudoCode;
prog : FUNCTION SIGNATURE '(' ')'
| FUNCTION SIGNATURE '{' VARB '}' ;
param: VARB | VARB ',' param ;
assignment: VARB '=' NUMBER ;
FUNCTION: 'function' ;
VARB: [a-z0-9]+ ;
SIGNATURE: [a-zA-Z0-9]+ ;
NUMBER: [0-9]+ | [0-9]+ '.' [0-9]+ ;
WS: [ \t\r\n]+ -> skip ;
问题是在编译和生成解析器、词法分析器等之后...然后 运行 grun PseudoCode prog -tree
输入例如:function bla{bleh}
我不断收到以下错误:
line 1:9 no viable alternative at input 'functionbla'
有人能指出我的语法有什么问题吗?
bla
是 VARB
,而不是 SIGNATURE
,因为它匹配两个规则并且 VARB
在语法中排在第一位。按照您定义词法分析器规则的方式,如果标识符包含大写字母,则它只能匹配为 SIGNATURE
。
解决此问题的最简单方法是为标识符设置一个词法分析器规则,然后在您当前使用 SIGNATURE
或 VARB
的任何地方使用它。如果你想在某些地方禁止大写字母,你可以简单地在一个动作或监听器中检查这个条件,这也可以让你产生比语法错误更清晰的错误消息(例如 "capital letters are not allowed in variable names")。
如果您绝对确实需要变量名中的大写字母作为语法错误,您可以为带有大写字母的标识符定义一种规则,另一种不使用大写字母。然后你可以在你想要允许两者的地方使用 ID_WITH_CAPITALS | ID_LOWER_CASE_ONLY
和 ID_LOWER_CASE_ONLY
在你只想允许小写字母的情况下。
PS:您还需要确保您的标识符规则不匹配数字(VARB
和 SIGNATURE
目前都匹配)。目前 NUMBER
代币只会为带小数点的数字生成。