我正在用PseudoCode实现一种简单的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 ;问题是在编译和生成Parser、Lexer等.然后使用grun PseudoCode prog -tree运行,输入为:function bla{bleh}
我继续得到以下错误:
line 1:9 no viable alternative at input 'functionbla'有人能指出我的语法出了什么问题吗?
发布于 2019-07-04 16:49:46
bla是VARB,而不是SIGNATURE,因为它匹配规则,而VARB在语法中居第一位。按照定义lexer规则的方式,只有在标识符包含大写字母时才能将标识符匹配为SIGNATURE。
解决此问题的最简单方法是为标识符设置一个单一的lexer规则,然后在当前使用SIGNATURE或VARB的任何地方使用该规则。如果要在某些地方不允许大写字母,只需在操作或侦听器中检查此条件,这还允许您生成比语法错误更清晰的错误消息(例如,“变量名称中不允许大写字母”)。
如果您确实需要变量名称中的大写字母为语法错误,则可以为带有大写字母的标识符定义一条规则,而不使用大写字母的规则。然后,您可以在只允许小写字母的地方使用ID_WITH_CAPITALS | ID_LOWER_CASE_ONLY,在只允许小写字母的情况下使用ID_LOWER_CASE_ONLY。
PS:您还需要确保标识符规则与数字不匹配( VARB和SIGNATURE目前都这样做)。目前,只有小数点的数字才会生成NUMBER标记。
https://stackoverflow.com/questions/56891788
复制相似问题