原创
这是我第一次在 stackoverflow 上问问题,所以我希望解决方案不会太明显。我正在尝试使用antlr来解析xml文件中的数据,以便为我在eclipse中创建的java程序生成可用的 token 。我只有使用antlr和antlr-works IDE来生成我需要合并的java代码的经验。问题是,我的 xml 文件非常大且复杂,因此一开始,我只想一次查看几个属性。为了让事情对我来说更简单,我尝试使用过滤器选项来筛选并仅获取与我的 token 定义匹配的数据。我意识到过滤器选项只能在您分别定义解析器和词法分析器语法时使用,但是当我尝试调整组合语法时,我突然开始在错误提示丢失或不需要的标记后出现错误,我一直在拉我的试图理解为什么其中一种有效,而另一种却不起作用。我将它们保存在同一个文件中,删除选项语句无法解决问题。
这是我的组合语法,然后是我的改编语法,如果有人能给我任何帮助或指导,我将非常感激。
组合:
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 文件中时,词法分析器规则似乎仍然中断,即使我定义的唯一规则是 All : .*;,我收到 EarlyExitException。另外,如果我理解正确,则 tokenVocab 选项从词法分析器语法中搜索 token 文件,但由于我收到错误并且它没有生成任何代码,因此尚未创建 token 文件,因此我假设如果没有它,解析器将无法正确生成。知道发生了什么吗?我尝试过搜索类似的问题,但很多 Material 似乎都断言,当输入中没有找到与规则匹配的标记时,就会导致此错误,但因为我什至还没有达到我给它输入这个的程度不可能是这样。
最佳答案
当分离词法分析器和解析器语法时,ANTLR 不会在生成的 .java 源文件的名称后面附加 "Lexer"
或 "Parser"
。因此,在这种情况下您应该使用唯一的名称:
解析器
parser grammar DataExtractParser;
options {
tokenVocab=DataExtractLexer;
}
...
词法分析器
lexer grammar DataExtractLexer;
...
此外,正如我之前提到的,通过 tokenVocab=LEXER_GRAMMAR_NAME;
选项明确指示解析器应使用哪些标记(词法分析器规则)。
关于java - 组合语法可以工作,但是当词法分析器和解析器语法分离时会出现错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13390389/