2

原来的

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

这是我的综合语法,然后是我的改编语法,如果有人能给我任何帮助或指导,我将不胜感激。

结合:

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 类而没有抱怨,但是,当我将词法分析器定义保存在它自己的 .g 文件中时,词法分析器规则似乎仍然中断,即使我定义的唯一规则是全部: .*;,我得到一个 EarlyExitException。另外,如果我理解正确,tokenVocab 选项会从词法分析器语法中搜索令牌文件,但由于我收到错误并且它没有生成任何代码,因此还没有创建令牌文件,所以我假设没有它,解析器就不能正确生成。知道发生了什么吗?我曾尝试搜索类似的问题,但很多材料似乎断言,当在输入中找不到与规则匹配的标记时会导致此错误,但因为我什至还没有达到我给它输入这个的地步不可能的。

4

2 回答 2

3

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

解析器

parser grammar DataExtractParser;

options {
  tokenVocab=DataExtractLexer; 
}

...

词法分析器

lexer grammar DataExtractLexer;

...

另外,正如我之前提到的,明确指出解析器应该通过tokenVocab=LEXER_GRAMMAR_NAME;选项使用哪些标记(词法分析器规则)。

于 2012-11-15T08:18:22.750 回答
2

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

parser grammar dataExtract;

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

prog : .*;
于 2012-11-15T05:51:57.450 回答