我正在尝试创建一个 ANTLR 语法来解析可选地具有重复计数的键序列。例如,(a b c r5)
表示“重复键 a、b 和 c 五次”。
我有语法工作KEYS : ('a'..'z'|'A'..'Z')
.
但是当我尝试添加数字键时KEYS : ('a'..'z'|'A'..'Z'|'0'..'9')
输入表达式如(a 5 r5)
,解析在中间的 5 处失败,因为它无法判断 5 是 INTEGER 还是 KEY。 (或者我认为是这样;错误消息很难解释“NoViableAltException”)。
我尝试过这些有效的语法形式(“r”表示“重复计数”):
repeat : '(' LETTERKEYS INTEGER ')' - works for a-zA-Z
repeat : '(' LETTERKEYS 'r' INTEGER ')'; - works for a-zA-Z
但我失败了
repeat : '(' LETTERSandDIGITKEYS INTEGER ')' - fails on '(a 5 r5)'
repeat : '(' LETTERSandDIGITKEYS 'r' INTEGER ')'; - fails on '(a 5 r5)'
也许语法无法识别;也许我需要以相同的方式识别所有 5 的键(如键或数字或整数),并在解析树中将中间的数字实例解释为键,并将最后一组数字解释为整数计数?
是否可以定义一个语法,允许我重复数字键和字母键,以便像这样的表达式(a 5 123 r5)
会被正确识别吗? (也就是说,“重复键 a,5,1,2,3 五次。”)我不受特定语法的限制,尽管使用类似的语法会很好。
谢谢。
解析在中间 5 处失败,因为它无法判断 5 是 INTEGER 还是 KEY。
如果您定义了以下规则:
INTEGER : [0-9]+;
KEY : [a-zA-Z0-9];
然后是一个数字,比如5
在你的例子中,永远会成为INTEGER
令牌。即使
解析器正在尝试匹配KEY
令牌,5
将成为一个INTEGER
。没有什么
你可以这样做:这就是 ANTLR 词法分析器的工作方式。词法分析器按以下方式工作:
- 尝试消耗尽可能多的字符(最长的匹配获胜)
- 如果 2 个或更多规则匹配相同的字符(例如
INTEGER
and KEY
的情况下5
),让先定义的规则“获胜”
如果你想要一个5
成为一个INTEGER
,但有时一个KEY
,做这样的事情:
key : KEY | SINGLE_DIGIT | R;
integer : INTEGER | SINGLE_DIGIT;
repeat : R integer;
SINGLE_DIGIT : [0-9];
INTEGER : [0-9]+;
R : 'r';
KEY : [a-zA-Z];
在你的解析器规则中,你使用key
and integer
代替KEY
and INTEGER
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)