语法模块化:在首先定义其他规则之后导入词法分析规则的方法?

时间:2012-11-09 20:10:12

标签: antlr composition

说我有一个简单的语法(词法分析器和解析器)用于解析&评估简单的数学表达式(如在那里的一些antlr示例中),它们也允许简单的变量定义(即分配浮点值)和使用这些变量。例如。可以处理以下内容:

 r = 2.5;
 PI = 3.14;
 PI * r * r;

这应该用于更复杂的语法。实际上,有几个不同的。 问题是上面包含的词法分析器基本上将每个字符串识别为标记类型ID,即潜在的变量名称,但更复杂的语法可能包含其他关键字。

如果我这样做

lexer grammar ComplexLexer;
import SimpleMathExprLexer;
// ...
IF : 'if'|'IF';
THEN : 'then'|'THEN';
// ...

然后ID已经与这些关键字匹配并不是非常有用。只需将导入语句移到这些规则下面就不起作用了。有什么方法可以解决这个问题吗,或者当我看到作文时,我是否完全走错路?

1 个答案:

答案 0 :(得分:2)

ANTLR只会优先考虑首先定义的规则。这意味着如果你有一个词法分析器语法G,那就导入词法分析器语法G3并在语法G2之后导入:

lexer grammar G;

import G3, G2;

...

或类似地:

lexer grammar G;

import G3;

...


lexer grammar G3;

import G2;

...

来自G3的规则优先于G2,但G的规则优先于G3 {{ 1}}。

与单个词法分析器语法一样,像G2这样的规则定义之后的规则,以匹配IDENTIFIER"if"等关键字...