Antlr中的Lexer模式

Wud*_*ong 4 java antlr antlr4

all:我正在尝试编写一个antlr解析器来解析一些文本,其格式如下:

RP   NUCLEOTIDE SEQUENCE [GENOMIC DNA],
RP   PROTEIN SEQUENCE OF 1-22; 2-17;
RP   240-256; 318-339 AND 381-390, AND CHARACTERIZATION.
Run Code Online (Sandbox Code Playgroud)

基本上所有行都有一个'RP '指示文本行的内容,最后一行应以a "."结尾表示此类行的结尾.文本也可以是任何东西.我最终需要的是文本.

我为此编写了一个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;
Run Code Online (Sandbox Code Playgroud)

这里的想法是当看到第一个RP_HEADER时,它变为RP_FREE_TEXT_MODE,从而跳过行之间的任何RP_HEADER.当看到DOT_NEWLINE时,返回主模式.

但是,这个语法不能用Antlr 4.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}
Run Code Online (Sandbox Code Playgroud)

我不太明白为什么会产生错误.任何人都可以解释在Antlr中使用词法模式的正确方法吗?此外,TOKEN是否在解析器规则不可用的模式中定义?

编辑:

正如@auselen建议的那样,我将lexer语法放在一个单独的文件RefLineLex.g4中:

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;
Run Code Online (Sandbox Code Playgroud)

在另一个组合语法RefLine.g4我有:

grammar RefLine;
import RefLineLex;

rp_line: RP_HEADER RP_TEXT ;
Run Code Online (Sandbox Code Playgroud)

现在Antlr编译文件,但在RefLineLexer.java中生成:

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

常量: RP_FREE_TEXT_MODE未在RefLineLexer.java中的任何位置定义.我还缺少什么吗?

aus*_*len 8

Lexer模式仅适用于Lexer语法,而不适用于复合语法(Lexer + Parser).有关一些不良文档的信息,请参阅Lexer规则,并在github上查看XML Parser实现.

您应该能够errorType=MODE_NOT_IN_LEXER在错误打印中提供非常有用的信息中理解这一点:)

  • `Lexer Rules`链接坏了:) (5认同)