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 ruleINT
所需的空格字符不在“intt”中
为何要这样做呢?我认为这是因为lexer在解析器之前运行,解析器得到的已经是语义等价物。在第二个示例中,即使在INT\u string
中用'INT'
替换lexer规则INT
,也会产生与我预期的相同的行为,antlr只是为该匹配生成一个隐藏的lexer规则。但不是100%确定
告诉我这是否有帮助,如果我想出了解决第二种情况的方法,我将进行编辑:)这就是全部语法吗?还是语法上有更多的东西?我把它改了一点,我想我们需要更多的细节。aaa是根本规则吗?你需要解析什么?你能再读一遍我的问题吗?我编辑了它