这似乎工作,因为你想:
LET : [a-z];
INT : 'int ';
cchar : LET | '-' | ' ';
wor: cchar+;
int_string: INT;
aaa: (wor|int_string)+;
这是什么语法说的是:alow我一个字或一个整数声明,其中integer是一个声明,如果它是“诠释”后面有一个空格定义为一个词法分析器项目,其他一切都是单词。
下面的配置不起作用:
LET : [a-z];
INT : 'int';
cchar : LET | '-' | ' ';
wor: cchar+;
int_string: INT ' ';
aaa: (wor|int_string)+;
移动空间的语法规则,而不是词法规则后,它无法解析“INTT”例如,其实有一个“诠释”的任何单词子。它发生是因为词法分析器部分似乎读取任何发生的'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
也会产生与我预期的相同的行为antlr仅为该匹配生成隐藏词法分析器规则。不是100%确定。
告诉我,这会有所帮助,如果我想出了一个办法来解决第二种情况,我会让编辑:)
这是整个语法?还是有更多的语法? – 2015-03-31 21:06:41
我改变了一点点 – Annabelle 2015-03-31 22:59:35
Annabelle,我想我们需要更多的细节。是aaa的根本规则?你需要解析什么? – 2015-04-01 07:42:55