编辑:我更改了示例以更好地解释我想要获得的内容。 这是我的语法:
INTEGER : ' int ';
LET : [a-z] ;
cchar : LET | '-' | ' ' ;
wor : cchar+;
aaa : wor+ | wor* INTEGER wor* ;
aaa是根。并编写例如:'xx int xx int'。 我想得到一个结果:'x x int x x i n t'。只应该捕获第一个int,下一个不应该给出“无关输入”错误,而是分成字母。
我该如何解决?
答案 0 :(得分:0)
这似乎可以按你的意愿运作:
LET : [a-z];
INT : 'int ';
cchar : LET | '-' | ' ';
wor: cchar+;
int_string: INT;
aaa: (wor|int_string)+;
这个语法说的是:给我一个单词或整数声明,其中整数是声明,如果它是' int'后跟一个定义为词法分析项的空格,其他一切都是单词。
现在以下内容不起作用:
LET : [a-z];
INT : 'int';
cchar : LET | '-' | ' ';
wor: cchar+;
int_string: INT ' ';
aaa: (wor|int_string)+;
将空格移动到解析器规则而不是词法分析器规则之后,它无法解析' intt'例如,实际上任何一个单词都有' int'子。之所以会发生这种情况,因为词法分析器部分似乎可以读取任何出现的' int'因为INT甚至wor
都没有解析' intt'现在作为字符串,它会尝试匹配(wor int (cchar t))
,但由于某些原因不匹配' int'作为单独的cchars。
第一个示例wor
规则解析' intt'为(wor (cchar i) (cchar n) (cchar t) (cchar t))
。这是有道理的。第一个示例的语法在词法分析阶段不能匹配,因为词法分析器INT
所需的空格字符不在' intt'。
为什么这样做?我认为这是因为词法分析器在解析器之前运行以及解析器获得的内容已经是语义等价物。在第二个示例中,即使用INT
中的'int'
替换词法分析器规则int_string
也会产生与我预期相同的行为,而antlr只会为该匹配生成隐藏的词法分析器规则。但不是100%肯定。
告诉我这是否有帮助,如果我想出办法解决第二种情况,我会做一个编辑:)