4

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

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

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

如果我做

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

那么 ID 已经与这些关键字匹配并不是很有帮助。简单地将 import 语句移到这些规则之下是行不通的。有没有办法解决这个问题,或者当我看构图时我完全走错了路?

4

1 回答 1

2

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

lexer grammar G;

import G3, G2;

...

或类似地:

lexer grammar G;

import G3;

...


lexer grammar G3;

import G2;

...

from 的规则G3将优先于G2,但 from 的规则G将优先于G3 and G2

就像单个词法分析器语法一样,IDENTIFIER您在匹配关键字(如, , ... )的规则之后定义的规则"if""then"

于 2012-11-09T20:23:39.680 回答