当词法分析器和解析器语法分离时,组合语法可以正常工作吗?

时间:2012-11-15 01:43:45

标签: java xml-parsing antlr antlrworks

原始

这是我第一次在stackoverflow上提问,所以我希望解决方案不是太明显。我正在尝试使用antlr来解析来自xml文件的数据,以便为我在eclipse中创建的java程序生成可用的令牌。我只有使用antlr和antlr-works IDE来生成我需要合并的java代码的经验。问题是,我的xml文件是非常庞大和复杂的,所以从一开始我只想看几个属性。为了使事情更简单,我试图使用过滤器选项来筛选并仅获取与我的令牌定义匹配的数据。我意识到只有在你单独定义你的解析器和词法分析器语法时才能使用过滤器选项,但是当我试图调整我的组合语法时,我突然开始在错误抱怨丢失或不需要的令牌后收到错误,我一直在拉我的试图理解为什么一个有效而另一个无效。我将它们保存在同一个文件中,删除options语句无法解决问题。

这是我的综合语法,然后是我改编的语法,如果有人能给我任何帮助或方向,我会非常感激。

结合

grammar dataExtract;

prog    :    .*;

SOF     :      ('<posts>');

Tag_string :    ('<')(.~'>')+('>');

Tag :   ('Tags="')Tag_string+('"');

WS  :   ( ' '
        | '\t'
        | '\r'
        | '\n'
        ) {$channel=HIDDEN;}
    ;

EOF :   '</posts>';

独立的:

parser grammar dataExtract;

prog    :    .*;

lexer grammar dataExtract


SOF     :      ('<posts>');


options{filter=true};

Tag_string :    ('<')(.~'>')+('>');

Tag :   ('Tags="')Tag_string+('"');

WS  :   ( ' '
        | '\t'
        | '\r'
        | '\n'
        ) {$channel=HIDDEN;}
    ;

EOF :   '</posts>';

更新

感谢您的回答,这对我来说很有意义,而且我更接近于让我的语法工作,我似乎还有一个问题。解析器语法似乎工作得很好,并且antlrworks甚至可以生成一个Java类而不会抱怨,但是,当我将lexer定义保存在它自己的.g文件中时,词法分析器规则似乎会中断,即使我定义的唯一规则是All :。*;,我得到一个EarlyExitException。此外,如果我理解正确,tokenVocab选项从词法分析器语法中搜索令牌文件,但由于我收到错误并且它没有生成任何代码,因此没有创建令牌文件,所以我会假设没有它,不应该正确生成解析器。知道发生了什么吗?我试过搜索类似的问题,但很多材料似乎断言,当输入中没有找到符合规则的令牌时会导致此错误,但是因为我甚至没有达到我给它输入的点不可能是这样。

2 个答案:

答案 0 :(得分:3)

在分离词法分析器和解析器语法时,ANTLR不会在生成的.java源文件的名称后附加"Lexer""Parser"。所以在这种情况下你应该使用唯一的名字:

解析器

parser grammar DataExtractParser;

options {
  tokenVocab=DataExtractLexer; 
}

...

词法分析

lexer grammar DataExtractLexer;

...

另外,如前所述,通过tokenVocab=LEXER_GRAMMAR_NAME;选项明确指出解析器应使用的令牌(词法规则)。

答案 1 :(得分:1)

您需要告诉解析器使用哪个令牌集。

parser grammar dataExtract;

options
{
  tokenVocab=dataExtract; // Looks for dataExtract.tokens file
}

prog : .*;