我正在使用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'
有人可以指出我的语法有什么问题吗?
答案 0 :(得分:1)
bla
是VARB
,而不是SIGNATURE
,因为它匹配两个规则,并且VARB
在语法中排在第一位。定义词法分析器规则的方式,如果标识符包含大写字母,则只能与SIGNATURE
匹配。
此问题的最简单解决方案是为标识符使用单个词法分析器规则,然后在当前使用SIGNATURE
或VARB
的任何地方使用该规则。如果要在某些地方禁止使用大写字母,则只需在操作或侦听器中检查此条件,这也将使您产生比语法错误更清晰的错误消息(例如,“变量名中不允许使用大写字母”)
如果确实确实需要变量名中的大写字母是语法错误,则可以为带有大写字母的标识符定义一个规则,为不带大写字母的标识符定义一个规则。然后,您可以在既要允许两者都使用的地方使用ID_WITH_CAPITALS | ID_LOWER_CASE_ONLY
,又要在只允许使用小写字母的情况下使用ID_LOWER_CASE_ONLY
。
PS:您还需要确保标识符规则与数字不匹配(VARB
和SIGNATURE
当前都匹配)。当前NUMBER
令牌仅针对带小数点的数字生成。