Parsing 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年

因此,我正在使用ANTLR语法来解析日期,我希望不仅能够识别单个日期单位,而且能够识别成对的日期单位

就本问题而言,我认为将我希望能够识别的问题分为三类可能会有所帮助:

  • 2019年8月的气温是多少?
    -简单明了。单一日期单位(2019年8月)
  • 2019年6月3日至昨天哪一天更热?
    -仍然很简单。两个日期单位(2019年6月3日和昨天)
  • 2018年8月至2019年哪个更热?-棘手。在这种情况下,用户的自然期望是比较2018年8月和2019年8月(隐含)。为了处理此类情况,我希望将2018年和2019年的
    解析为一对
    年的
    规则,并将
    8月的
    解析为
    月的
  • 我目前只处理案例1和案例2。案例1以一种简单的方式处理。案例2通过使用
    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的意思:)是的,不,我只是试图影响语法。这种由语义关注点驱动的影响不会自动使其成为语义问题,不是吗?我会说是的。语法元素保持不变,不管您对它们应用了什么含义。一个句法问题是,如果你期望某些词汇遵循严格的顺序。但在本例中,您将超越这个简单的语法部分,并尝试在其他语法正确的句子中解释用户的意思。