使用Antlr4从解析器规则中找不到Lexer规则

时间:2014-12-02 08:50:35

标签: java parsing antlr4

这个问题遵循以下问题:Using parser for OData v4 grammar

我取得了进步,但我有一个错误,我无法弄清楚原因。

语法ODataParser导入词法分析器ODataLexer。我成功地为这两个文件生成了Java类

词法分析器工作正常,我可以对我的字符串进行标记(“http://myhost.com/odata/Category(1)/Products?$ top = 2& $ orderby = name”):

"http"         HttpOrHttps
"://"          ColSlaSla
"myhost.com"   Ls32
"/"            '/'
"odata"        'odata'
"/"            '/'
"Category"     ODATA_ID_CHAR8
"("            SubDelims
"1"            DecOctet
")"            SubDelims
"/"            '/'
"Products"     ODATA_ID_CHAR8
"?"            '?'
"$top"         ODataSignal_TOP
"="            SubDelims
"2"            DecOctet
"&"            SubDelims
"$orderby"     ODataSignal_ORDERBY
"="            SubDelims
"name"         ODATA_ID_CHAR4

此外,正确的规则与每个令牌相关联。我有以下错误:

line 1:66 mismatched input '<EOF>' expecting HttpOrHttps

在为解析器启用跟踪后,我看到了这些跟踪:

enter   odataUri, LT(1)=<EOF>
enter   protocol, LT(1)=<EOF>
exit    protocol, LT(1)=<EOF>
exit    odataUri, LT(1)=<EOF>

似乎问题出现在解析器规则协议中。这是语法规则的摘录(odataUri是我使用的入口点):

grammar ODataParser;
import ODataLexer;

odataUri : protocol ColSlaSla host ( COLON port )?
       serviceRoot
       ( ODataSignal_METADATA | ODataSignal_BATCH | odataRelativeUri )? EOF;

protocol :  HttpOrHttps;

serviceRoot : SLASH ( segmentNZ SLASH )*;

odataRelativeUri : resourcePath ( QUESTION queryOptions )?;

这是词法分析器的相应部分:

ColCol : COLON COLON ;
ColSlaSla : COLON SLASH SLASH ;

HttpOrHttps : H T T P ;

这是我用来解析表达式的Java代码:

ANTLRInputStream in = new ANTLRInputStream(expression);

ODataParserLexer lexer = new ODataParserLexer(in);
ODataParserParser parser = new ODataParserParser(
                    new CommonTokenStream(lexer));
parser.setTrace(true);

// Errors catching
ODataErrorListener errorListener = new ODataErrorListener();
parser.addErrorListener(errorListener);

ODataParseListener listener = new ODataParseListener();
parser.addParseListener(listener);

OdataUriContext ctx = parser.odataUri();

有没有人在这看到错误。 非常感谢您的帮助

0 个答案:

没有答案