【问题标题】:Grammar modularisation: A way to import lexer rules after defining others first?语法模块化:先定义其他规则后导入词法分析器规则的方法?
【发布时间】:2012-11-09 20:10:11
【问题描述】:

假设我有一个简单的语法(词法分析器和解析器),用于解析和评估简单的数学表达式(如一些 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 语句移到这些规则之下是行不通的。有什么办法可以解决这个问题,还是我在看构图时完全走错了路?

【问题讨论】:

  • 这在任何环境中都是一个众所周知的难题(不仅仅是 antlr --- 只是在一般的语法中)。这里描述了我知道的一种方法:itu.dk/~brabrand/banana-algebra

标签: antlr composition


【解决方案1】:

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"、...等关键字的规则之后定义

【讨论】:

  • 是的,优先级就是我所说的“ID 已经与这些关键字匹配并没有太大帮助”的意思。很抱歉措辞模棱两可。但是在阅读了您的答案后,我想我会尝试独立于SimpleMathExprLexer 定义ComplexLexer,然后将两者(按此顺序)导入,例如CompositeLexer
  • @arne.b,不用担心你对问题的措辞。这对我来说已经足够清楚了。您制作复合“主要”词法分析器语法的解决方案是一个很好的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-27
  • 2013-04-29
  • 1970-01-01
  • 1970-01-01
  • 2021-11-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多