ANTLR中的语法和所选单词

ANTLR中的语法和所选单词,antlr,Antlr,编辑:我更改了示例,以便更好地解释我想要得到的东西。 这是我的语法: 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,下一个int不应给出“无关输入”错误,而应拆分为字母 如何修复它?这似乎可以按

编辑:我更改了示例,以便更好地解释我想要得到的东西。 这是我的语法:

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,下一个int不应给出“无关输入”错误,而应拆分为字母


如何修复它?

这似乎可以按照您的要求工作:

LET : [a-z];
INT : 'int ';

cchar : LET | '-' | ' ';
wor: cchar+;

int_string: INT;

aaa: (wor|int_string)+;
这个语法的意思是:只要一个单词或一个整数声明,其中整数是一个声明,如果它是“int”,后跟一个定义为lexer项的空格,那么其他所有东西都是单词

现在,以下各项不起作用:

LET : [a-z];
INT : 'int';

cchar : LET | '-' | ' ';
wor: cchar+;

int_string: INT ' ';

aaa: (wor|int_string)+;
在将空格移动到解析器规则而不是lexer规则后,它无法解析'intt',例如,事实上任何具有'int'子字符串的单词。之所以会发生这种情况,是因为lexer部分似乎将任何出现的“int”读入int,甚至
wor
现在也没有将“int”解析为字符串,它尝试匹配
(wor int(cchar t))
,但由于某种原因,它无法将“int”作为单独的cchar进行匹配

第一个示例的
wor
规则将“intt”解析为
(wor(cchar i)(cchar n)(cchar t)(cchar t))
。这是有道理的。第一个示例的语法在lexer阶段无法匹配,因为lexer rule
INT
所需的空格字符不在“intt”中

为何要这样做呢?我认为这是因为lexer在解析器之前运行,解析器得到的已经是语义等价物。在第二个示例中,即使在
INT\u string
中用
'INT'
替换lexer规则
INT
,也会产生与我预期的相同的行为,antlr只是为该匹配生成一个隐藏的lexer规则。但不是100%确定


告诉我这是否有帮助,如果我想出了解决第二种情况的方法,我将进行编辑:)

这就是全部语法吗?还是语法上有更多的东西?我把它改了一点,我想我们需要更多的细节。aaa是根本规则吗?你需要解析什么?你能再读一遍我的问题吗?我编辑了它