gpt4 book ai didi

parsing - ANTLR4:导入和 tokenVocab 之间有什么区别吗?

转载 作者:行者123 更新时间:2023-12-02 17:11:18 24 4
gpt4 key购买 nike

可以将 import 语句或 tokenVocab 选项放入解析器语法中以重用词法分析器语法。

Sam Harwell 建议始终使用 tokenVocab 而不是 import [1]。

importtokenVocab 之间有什么区别吗?如果没有区别(Sam 说使用 tokenVocab),那么为什么要有 import 语句?

[1] I actually recommend avoiding the import statement altogether in ANTLR. Use the tokenVocab feature instead. [Sam Harwell]

参见ANTLR4: Unrecognized constant value in a lexer command

最佳答案

首先,我们来谈谈导入

import的作用类似于C/C++语言中的#include,都是将src复制到dst。如果存在冲突,ANTLR4 将尝试合并两个语法。

使用 import 有点令人沮丧,因为有太多限制:

  1. 并非每种语法都可以导入其他每种语法。

    • 词法分析器语法可以导入词法分析器语法。
    • 解析器语法可以导入解析器语法。
    • 组合语法可以导入词法分析器或解析器语法。
  2. 导入时,语法中的选项将被忽略。

  3. 导入时,词法分析器语法中不允许使用 mode

所以你实际上不能在解析器语法中导入词法分析器语法,因为它们不是同一类。但是您可以在组合语法中导入词法分析器。

这些限制缩小了导入的使用范围。我认为使用 import 的最佳情况是将大型词法分析器或解析器语法分成几个部分,以使其更易于管理。

现在,请记住我们不能使用 import 在解析器语法中导入词法分析器语法?这就是为什么我们需要 tokenVocab,它被设计为在解析器或组合语法中使用单独的词法分析器。

上面的结论是:

  • 在词法分析器语法中,您只能使用import
  • 在一个解析器语法中,只能使用 import 导入另一个解析器语法。您只能使用 tokenVocab 来使用其他词法分析器语法。
  • 在组合语法中,您可以同时使用 importtokenVocab

对于第三个,现在有什么区别?

不同之处在于,使用tokenVocab需要先编译词法分析器,因为tokenVocab只是一个声明需要另一个语法的选项。而使用 import 则不需要这样做,因为它会将 src 复制到当前语法。

例如,有三个语法文件:

G1.g4

grammar G1;
r: B;

G2.g4

grammar G2;
import G1

G3.g4

grammar G3;
options { tokenVocab=G2; }
t: A;

如果直接编译G2就可以了。但是如果我们尝试编译G3,就会出现错误:

error(160): G3.g4:3:21: cannot find tokens file ./G1.tokens

但是,如果我们先编译G1,就会有G1.tokens。现在G3就编译成功了。

关于parsing - ANTLR4:导入和 tokenVocab 之间有什么区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28829049/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com