假设我有一个简单的语法(词法分析器和解析器)用于解析&评估简单的数学表达式(如在那里的一些antlr示例中),它们也允许简单的变量定义(即分配浮点值)和使用这些变量.例如.可以处理以下内容:
r = 2.5;
PI = 3.14;
PI * r * r;
这应该用于更复杂的语法.实际上,有几个不同的.
问题是上面包含的词法分析器基本上将每个字符串识别为令牌类型ID,即潜在的变量名称,但更复杂的语法可能包含其他关键字.
如果我做
lexer grammar ComplexLexer;
import SimpleMathExprLexer;
// ...
IF : 'if'|'IF';
THEN : 'then'|'THEN';
// ...
那么ID已经与这些关键字匹配并不是非常有用.只需将导入语句移到这些规则下面就不起作用了.有什么方法可以解决这个问题吗,或者当我看作文时,我是否完全走错了路?
最佳答案 ANTLR将优先考虑首先定义的规则.这意味着如果你有一个词法分析器语法G,那就导入词法分子语法G3并在那个语法G2之后:
lexer grammar G;
import G3, G2;
...
或类似的:
lexer grammar G;
import G3;
...
lexer grammar G3;
import G2;
...
G3的规则优先于G2,但G的规则优先于G3和G2.
就像单个词法分析器语法一样,IDENTIFIER之类的规则是在符合“if”,“then”等关键字的规则之后定义的……