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

Antlr中的Lexer模式

陆宾白
2023-03-14

所有:我正在尝试编写一个antlr解析器来解析一些文本,这些文本的格式如下:

RP   NUCLEOTIDE SEQUENCE [GENOMIC DNA],
RP   PROTEIN SEQUENCE OF 1-22; 2-17;
RP   240-256; 318-339 AND 381-390, AND CHARACTERIZATION.

基本上,所有行都有一个前导“rp”来指示一行文本的用途,最后一行应该以“.”结尾,以指示这类行的结尾。文本也可以是任何东西。最后我需要的是文本。

我为此写了一个Antlr语法:

grammar RefLine;

rp_line: RP_HEADER RP_TEXT;

RP_HEADER : 'RP   '            -> pushMode(RP_FREE_TEXT_MODE);

mode RP_FREE_TEXT_MODE;
RP_HEADER_SKIP: '\nRP   '      -> skip;
RP_TEXT: .+;
DOT_NEWLINE: '.\n'             -> popMode;

这里的思想是,当看到第一个RP_HEADER时,它会更改为RP_FREE_TEXT_MODE并因此跳过行间的任何RP_HEADER。当看到DOT_NEWLINE时,返回主模式。

但是,该语法不能与ANTLR4.1一起编译,从而产生错误:

[ERROR] Message{errorType=MODE_NOT_IN_LEXER, args=[RP_FREE_TEXT_MODE, org.antlr.v4.tool.Grammar@5c0662], e=null, fileName='RefLine.g4', line=7, charPosition=5}
[WARNING] Message{errorType=IMPLICIT_TOKEN_DEFINITION, args=[RP_TEXT], e=null, fileName='RefLine.g4', line=3, charPosition=19}

我不太明白为什么会产生这个错误。谁能解释一下在ANTLR中使用lexer模式的正确方法吗?还有,模式中定义的令牌对解析器规则不可用吗?。

编辑:

lexer grammar RefLineLex;

RP_HEADER : 'RP   '            -> pushMode(RP_FREE_TEXT_MODE);

mode RP_FREE_TEXT_MODE;
RP_HEADER_SKIP: '\nRP   '      -> skip;
RP_TEXT: .+;
DOT_NEWLINE: '.\n'             -> popMode;

在另一个组合语法refleine.g4中:

grammar RefLine;
import RefLineLex;

rp_line: RP_HEADER RP_TEXT ;

现在Antlr编译文件,但在RefleinelExer.java中它生成了:

private void RP_HEADER_action(RuleContext _localctx, int actionIndex) {
        switch (actionIndex) {
        case 0: pushMode(RP_FREE_TEXT_MODE);  break;
        }
    }

常量:rp_free_text_mode没有在refleinelexer.java中的任何地方定义。我是不是还漏了什么?

共有1个答案

尉迟卓
2023-03-14

Lexer模式仅在Lexer语法中可用,而在复合语法(Lexer+Parser)中不可用。请参阅Lexer Rules以了解一些糟糕的文档,并查看github上的XML解析器实现以了解一个示例。

您应该能够在错误打印中非常详细的errortype=mode_not_in_lexer消息中理解这一点:)

 类似资料:
  • 本文向大家介绍ANTLR Lexer命令,包括了ANTLR Lexer命令的使用技巧和注意事项,需要的朋友参考一下 示例 词法分析器规则可以具有关联的命令: ->在规则末尾的a之后定义命令。 skip:跳过匹配的文本,不会发出令牌 channel(n):在其他频道上发出令牌 type(n):更改发出的令牌类型 mode(n),pushMode(n),popMode,more:控制词法分析器模式

  • 我有一个antlr语法,它有多个与同一个单词匹配的词法规则。在词法分析过程中无法解决这个问题,但通过语法,它就变得毫不含糊了。 示例: 输入:<代码>1英寸(米) 单词“in”与lexer规则和匹配。 如何在保持语法文件可读性的同时解决此问题?

  • 查看文档,ANTLR2过去有一种叫做谓词法的东西,下面的例子是这样的(灵感来自Pascal): 在我看来,这实际上是规则开头的一个积极的前瞻性断言:如果前瞻性与匹配,那么第一个规则将被应用(并与该输入的部分匹配),依此类推。 我还没有在ANTLR4中找到这样的东西。2到3迁移指南似乎没有提到这一点,而3到4更改文档指出: ANTLR3和4之间最大的区别是ANTLR4接受您给出的任何语法,除非该语法

  • 我需要以下令牌: 允许的字符包括大写、小写、数字、空格和连字符 长度不固定(长度必须至少为两个字符) 标记必须至少包含一个空格或连字符 令牌必须以大写、小写、数字、空格或连字符开头和结尾(不能以空格开头或结尾) 下面语法中的ANTLR lexer规则“alphanumericspacehyphen”除了一个情况外几乎都起作用。使用解析器规则“sic”进行测试,以下输入将解析(不带引号): 以下输入

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

  • 我正在重新学习一些基本的Antlr,并尝试编写一个生成todo项的语法: 我遇到的问题是,有三个lexer规则特别“不匹配”,这取决于它们使用的上下文: 以下是我的完整语法以求清晰: 旁白:我知道还有其他奇怪的地方,比如一个事件的名称只能是一个单词,但我是在一次处理一个问题。