这个问题遵循以下问题: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();
有没有人在这看到错误。 非常感谢您的帮助