首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Antlr中的Lexer模式

Antlr中的Lexer模式
EN

Stack Overflow用户
提问于 2013-08-14 22:19:30
回答 1查看 9.2K关注 0票数 4

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

代码语言:javascript
复制
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语法:

代码语言:javascript
复制
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时,回到主模式。

然而,这个语法没有使用Antlr 4.1进行编译,从而产生错误:

代码语言:javascript
复制
[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模式的正确方法吗?此外,在模式中定义的令牌是否对解析器规则不可用?

编辑

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

代码语言:javascript
复制
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;

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

代码语言:javascript
复制
grammar RefLine;
import RefLineLex;

rp_line: RP_HEADER RP_TEXT ;

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

代码语言:javascript
复制
private void RP_HEADER_action(RuleContext _localctx, int actionIndex) {
        switch (actionIndex) {
        case 0: pushMode(RP_FREE_TEXT_MODE);  break;
        }
    }

常量:RP_FREE_TEXT_MODE没有在RefLineLexer.java中的任何地方定义。我还漏掉了什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-15 09:45:46

词汇模式只适用于词汇语法,而不适用于复合语法(Lexer + Parser)。有关一些糟糕的文档,请参阅Lexer规则,并查看github上的XML分析器实现以获得一个示例。

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

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18243283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档