ANTLR4输入没有可行的选择

时间:2019-07-04 16:38:16

标签: antlr antlr4

我正在使用ANTLR4实现一种简单的PseudoCode语言,这是我目前的语法:

// 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 ;

问题是在编译并生成了Parser,Lexer等之后,然后以grun PseudoCode prog -tree的形式运行,其输入为例如:function bla{bleh}

我不断遇到以下错误:

line 1:9 no viable alternative at input 'functionbla'

有人可以指出我的语法有什么问题吗?

1 个答案:

答案 0 :(得分:1)

blaVARB,而不是SIGNATURE,因为它匹配两个规则,并且VARB在语法中排在第一位。定义词法分析器规则的方式,如果标识符包含大写字母,则只能与SIGNATURE匹配。

此问题的最简单解决方案是为标识符使用单个词法分析器规则,然后在当前使用SIGNATUREVARB的任何地方使用该规则。如果要在某些地方禁止使用大写字母,则只需在操作或侦听器中检查此条件,这也将使您产生比语法错误更清晰的错误消息(例如,“变量名中不允许使用大写字母”)

如果确实确实需要变量名中的大写字母是语法错误,则可以为带有大写字母的标识符定义一个规则,为不带大写字母的标识符定义一个规则。然后,您可以在既要允许两者都使用的地方使用ID_WITH_CAPITALS | ID_LOWER_CASE_ONLY,又要在只允许使用小写字母的情况下使用ID_LOWER_CASE_ONLY

PS:您还需要确保标识符规则与数字不匹配(VARBSIGNATURE当前都匹配)。当前NUMBER令牌仅针对带小数点的数字生成。