当前位置: 首页 > 知识库问答 >
问题:

Antlr:通用令牌定义

公西培
2023-03-14

我想在一个中央Antlr文件中定义公共令牌常量。这样,我就可以定义几个不同的lexer和parser,并在运行时混合和匹配它们。如果它们都共享一组共同的令牌定义,那么它们就可以正常工作。

换句话说,我想看到公共静态final int WORD=2 ,所以他们都同意“2”是一个单词。

我创建了一个名为CommonTokenDefs的文件。g4并添加了如下部分:

tokens {
WORD, NUMBER
}

并包括

options { tokenVocab = CommonTokenDefs; }

在我的每一个人身上。g4文件。它不起作用。A.如果包含tokenVocab的g4文件在its中定义了令牌类型,那么它将分配一个不同的常量int,更糟糕的是,它将在its中定义一个令牌类型。令牌文件它将包含重复的常量!

FOO=1
BAR=2
WORD=1
NUMBER=2

执行导入CommonTokenDefs 也不起作用,因为如果我在lexer中定义一个令牌类型,并且它已经在CommonTokenDefs中,那么我会得到一个“token name FOO is ready defined”错误。

如何跨词法分析器和解析器创建通用词汇表?

共有1个答案

洪星文
2023-03-14

包含语法意味着合并它。导入的语法不是自己的实例,而是丰富了导入的语法。导入语法根据其中定义的内容对其标记进行编号(并添加导入语法中的标记)。

我在这里看到的唯一解决方案是在所有解析器中使用单个词法器语法,如果可能的话。您可以通过使用不同的基词法器(ANTLR选项:superClass)在您的词法器中实现某些变体,但这当然是有限的,尤其是不允许添加更多标记。

实际上,有一种方法可以让它按你的意愿工作。除了import语句(用于导入语法)之外,还有tokenVocab语法选项,用于加载*。令牌文件,带有对令牌的数值赋值。通过使用这样的令牌词汇表,您可以预定义ANTLR应该为每个令牌使用哪个值,从而可以确定某些令牌总是获得相同的数值。请参见生成的*。标记所需格式的文件。

我使用*. Tokens文件来分配数值,以便将某些关键字放置在连续的值范围内,这允许以后进行有效的检查,例如:

if (token >= KW_1 && token < KW100) ...

如果ANTLR可以自由地为每个关键字赋值,这是不可能的。

 类似资料:
  • 我有以下ANTLR 4的语法: 我试图解析以下字符串 代码解析出左侧的ab cd,在我的应用程序中,它将被视为文本字符串。然后,它将解析为一个字符集,在这种情况下,该字符集将转换为任何数字。我的语法对我来说很有用,但我不喜欢将语法作为语法分析器规则(CHAR | DASH),因为它只是被当作一个标记。我希望lexer创建一个字符串,并给我以下标记: 而不是这些 我看了其他的例子,但还没有弄明白。通

  • 现在我得到了:错误。 我知道我的输入被AND和TERM lexer规则匹配,但我希望能够指定TERM是除与AND规则匹配的内容之外的任何内容。

  • 我正在寻找一种在我的ANLTR解析器中使某些特定标记不区分大小写的方法。我已经尝试过的: > 将我的输入转换为所有小写。这不起作用,因为我语法的某些部分需要区分大小写。 保存标记的大小写版本。这也不起作用,因为这样我的lexer文件变得太大(打破了ANTLR的64k限制)。 我希望存在的是一些正则表达式技巧,或者可能是一个ANTLR标志,它告诉解析器以不同的方式对待某些标记。 例如: lexer应

  • 我正在编写一个ANTLR Lexer和解析器语法,它将解析与Java类非常相似的文本。最终,它将解析如下所示的文本: 我正在慢慢地构建Lexer和Parser。我已经成功地解析了,但是在解析时遇到了困难。 在添加对的支持之前,我能够在解析器中为空格、冒号和分号使用字符串文字,但在我遇到错误创建隐式标记。我为这些字符中的每一个定义了一个词法分析器规则,并用该规则替换了所有出现的文字。但是,这破坏了s

  • 我正在使用ANTLR4语法来解析SQLite查询。但是,lexer返回一个空的令牌流,即使我使用的是一个简单的选择查询。 这会产生以下错误: atorg.antlr.v4.runtime.Lexer.nextToken(Lexer.java:138) atorg.antlr.v4.runtime.BufferedTokenStream.fetch(BufferedTokenStream.java:

  • 需要注意的方法是和。实际上,我依赖于这样一个事实,即每个节点最终都分解为终端,因此如果一个节点没有被另一个重写处理(例如中的),那么它的每个终端都将位于中。对的每次调用都会添加到索引字段中,我假定该字段与AST和原始文本同步。也就是说,应该同时表示原始文本中的索引和当前标记的索引。 我最近遇到了一个空白问题。语法规则似乎悄无声息地吃掉了空白,而没有在任何解析器规则中提到它。这会导致空白标记无法通过