antlr4-解析以字母表开头的字母数字
对于字符串定义,我有以下ABNF规则antlr4-解析以字母表开头的字母数字,antlr4,Antlr4,对于字符串定义,我有以下ABNF规则 STRING = ALPHA *(allowedchar) allowedchar = "-" / "_" / DIGIT / ALPHA ALPH = A-Z ,a-z 有效令牌: aa1 a_1___a a23 a a-1 a_a -e -- -1 -a --1 --a 1 (如果第一个字符是alpha,则重置可以是任何字符形式的“allowedchar”) 无效令牌: aa1 a_1___a a23 a a-1 a_a -e
STRING = ALPHA *(allowedchar)
allowedchar = "-" / "_" / DIGIT / ALPHA
ALPH = A-Z ,a-z
有效令牌:
aa1
a_1___a
a23
a
a-1
a_a
-e
--
-1
-a
--1
--a
1
(如果第一个字符是alpha,则重置可以是任何字符形式的“allowedchar”)
无效令牌:
aa1
a_1___a
a23
a
a-1
a_a
-e
--
-1
-a
--1
--a
1
(不以字母开头)
到目前为止,除了“--a”
和“\uuu a”
之外,我的语法适用于所有输入(有效和无效)
ANTL4接受此令牌作为有效字符串
我不知道这为什么不起作用
我的语法
STRING : ALPHANUMERIC
ALPHA : [a-zA-Z]+ ;
fragment ALPHANUMERIC : ALPHA (ALLOWEDATTCHAR)* ;
fragment ALLOWEDATTCHAR : '-' | '_' | [0-9] | ALPHA ;
ANTL4接受此令牌作为有效字符串
我对此表示怀疑
假设您的ALPHA
规则如下所示:
fragment ALPHA : [a-zA-Z];
我确信ANTLR不会将“--a”
或“\uu a”
标记为字符串
检查输出流ANTLR正在向其写入错误/警告:ANTLR很可能正在通知您发生了错误,然后从中恢复并继续解析/词法分析
编辑
如果要覆盖ANTLR默认错误处理/报告,请参阅:ALPHA:[a-zA-Z]+;它将解析为“a”,并调用visiter实现方法,其中context.getText()只返回“a”。我希望该行为会使令牌无效,并调用BaseErrorListener.syntaxError(..)。感谢Bart Kiers,在为解析器和lexer添加错误处理程序后,我能够报告错误。