您可以有条件地更改 ANTLR 词法分析器模式吗?

问题描述 投票:0回答:1

我正在研究一种语言,其中有定义对象的外部语法和定义代码的内部语法。内部语法嵌入在各个地方。内部语法以 BEGIN 开始,以 END 结束。这很简单,除了内部代码语法也可以在代码内有多个 BEGIN/END 块。所以我的问题是,当我到达最后一个匹配的 END 对时,我可以仅将 BEGIN/END 对的计数引用到 popmode 吗?我猜这一定是可能的,但我只是不确定如何在 ANTLR 中最好地做到这一点。下面是语法的一个小例子:

procedure Foobar(somethingHappens: boolean)
  var
      MyRecord: Record "Some Table";
      MyDecimal: Decimal;
      otherBoolean: Boolean;
  begin
      if (somethingHappens) then
      BEGIN
        // do some stuff
      END
      // do other stuff
  end;

我有很多单词在外部语法中是特殊标记,但可以在内部语法中用作代码中的普通标识符,因此我需要两种模式。

antlr antlr4 lexer
1个回答
0
投票

是的,您可以通过在

@lexer::members {}
块中定义适当的变量来引用计数 BEGIN/END 对。但你可能不需要。

关于 BEGIN 规则

pushMode(BEGINEND_MODE)

编写一条附加规则以匹配 BEGINEND_MODE 中的 BEGIN,该规则执行相同的操作,递归地输入 BEGINEND_MODE。

在 BEGINEND_MODE 中编写一条执行

popMode()
的 END 规则。

BEGIN:
   "BEGIN"
   ->pushMode(BEGINEND_MODE)
   ;

[...]

mode BEGINEND_MODE;

BEGIN1:
   "BEGIN"
   ->pushMode(BEGINEND_MODE),type(BEGIN)
   ;

END:
   "END"
   ->popMode()
   ;

[...]
© www.soinside.com 2019 - 2024. All rights reserved.