令牌'B'和十六进制数'B'之间没有前缀的ANTLR混音

时间:2017-04-19 03:20:45

标签: antlr antlr4

我很难找到具有以下结构的语言的正确语法:

W1234
B1234[16]
B6789
W6789,B

其中1234和6789是任何十进制数。而且,B是没有任何前缀的任何十六进制数。

语法:

grammar Tsx7;

program returns [string code]
  : ident EOF
  ;

ident returns [string code]
    : 'W' NUMBER ( ',' ( DEC_DIGITS | HEX_DIGIT )+ )?
    | 'B' NUMBER ( '[' NUMBER ']' )?
    ;

NUMBER: DEC_DIGITS+;
fragment DEC_DIGITS: '0'..'9';
fragment HEX_DIGITS: 'A'..'F';

使用这些(合法)输入

W1,B
W34,1

我得到 InputMismatch NoViableAlt 例外。

这些输入可以正常运行:

W1
B2[8]
B3123

我尝试了几种语法,却找不到正确的语法。

感谢您的帮助, 马丁

1 个答案:

答案 0 :(得分:0)

不要在解析器规则中使用词法分析器片段。它们永远不会出现在解析器中。使这些规则成为普通词法规则或定义一个调用片段规则的规则。