Parsing ANTLR:如何为解析器规则选择提供优先级
因此,我正在使用ANTLR语法来解析日期,我希望不仅能够识别单个日期单位,而且能够识别成对的日期单位 就本问题而言,我认为将我希望能够识别的问题分为三类可能会有所帮助:Parsing ANTLR:如何为解析器规则选择提供优先级,parsing,nlp,compiler-construction,antlr,grammar,Parsing,Nlp,Compiler Construction,Antlr,Grammar,因此,我正在使用ANTLR语法来解析日期,我希望不仅能够识别单个日期单位,而且能够识别成对的日期单位 就本问题而言,我认为将我希望能够识别的问题分为三类可能会有所帮助: 2019年8月的气温是多少?-简单明了。单一日期单位(2019年8月) 2019年6月3日至昨天哪一天更热?-仍然很简单。两个日期单位(2019年6月3日和昨天) 2018年8月至2019年哪个更热?-棘手。在这种情况下,用户的自然期望是比较2018年8月和2019年8月(隐含)。为了处理此类情况,我希望将2018年和2019年
2019年8月的气温是多少?
-简单明了。单一日期单位(2019年8月)2019年6月3日至昨天哪一天更热?
-仍然很简单。两个日期单位(2019年6月3日和昨天)解析为一对年的规则,并将8月的解析为月的
date\u单元和date\u单元
规则进行处理。但为了现在处理案例3,我还尝试添加了一个年复一年
规则,以便2018年和2019年
在很久以前被选为year\u对
,但由于ANTLR的自上而下性质,它仍然将它们解析为2018年8月
和2019年
我如何将其更改为将2018年8月和2019年8月解析为2018年8月和2019年8月和2018年8月(同时保留常规的
date\u单位和date\u单位
规则?您试图为语法添加语义。从语言的角度来看,隐含的用户期望根本不重要。解析器(作为语法工具)只能确定输入是否符合语言,而不能确定输入是否也符合语义规则)
相反,您应该使用ANTLR4量化输入并创建解析树。然后在第二步中进行语义分析,您可以在其中应用特殊的日期规则(例如,自动填充隐式日期部分)。“自下而上”是一个几十年来与LR解析同义的术语,与ANTLR和问题无关。它是一个错误的术语
Mike上面的解决方案是大多数人都会做的,因为日期范围
只对应于元组
,而我们只需要在语义分析器中创建该类型。您需要从语法上描述不同的范围,比如元组
和其他变体。下面是一个语法,它可以做到这一点这三棵树都是你要找的
grammar Dates;
MONTH : 'January' | 'February' | 'March' | 'April' | 'May' | 'June' | 'July' | 'August' | 'September' | 'October' | 'November' | 'December' ;
YESTERDAY : 'yesterday' ;
FIRST : 'First';
SECOND : 'Second';
THIRD : 'Third';
AND : 'and' ;
BETWEEN : 'between';
ORDINAL: [1-9][0-9]* ('rd' | 'th');
CARDINAL : [0-9]+ ;
WS: [ \t\r\n]+ -> skip;
// NB: Note order here.
range
: BETWEEN month year_group
| BETWEEN date_unit AND date_unit
;
input: ( date_unit | range ) EOF ;
year_group : year AND year ;
date_unit : month day year | month year | year | yesterday ;
day : ordinal | CARDINAL ;
ordinal : ORDINAL | FIRST | SECOND | THIRD ;
month : MONTH ;
year : CARDINAL ;
yesterday : YESTERDAY ;
你能编辑你的问题并加上你的语法吗?那个题目很有误导性。你应该考虑用与你的实际问题相匹配的东西来代替它。是的,考虑到我期望的标题。我理解了这个短语……MikiChChek你为什么认为它是误导的?我想给一个规则优先。ther.“自底向上的风格解析”意味着LR解析器,ANTLR不会生成:它生成LL解析器(请参阅)。至少,这是我认为Mike的意思:)是的,不,我只是试图影响语法。这种由语义关注点驱动的影响不会自动使其成为语义问题,不是吗?我会说是的。语法元素保持不变,不管您对它们应用了什么含义。一个句法问题是,如果你期望某些词汇遵循严格的顺序。但在本例中,您将超越这个简单的语法部分,并尝试在其他语法正确的句子中解释用户的意思。