ANTLR4语法中的优先级问题

时间:2018-05-17 09:18:11

标签: parsing antlr antlr4 operator-precedence

我在这里开发了这个小语法我有一个问题:

grammar test;

    term : above_term | below_term;

    above_term :
        <assoc=right> 'forall' binders ',' forall_term
        | <assoc=right> above_term '->' above_term
        | <assoc=right> above_term '->' below_term
        | <assoc=right> below_term '->' above_term
        | <assoc=right> below_term '->' below_term
        ;

    below_term :
         <assoc = right> below_term arg (arg)*
        | '@' qualid (term)*
        | below_term '%' IDENT
        | qualid
        | sort
        | '(' term ')'
        ;

    forall_term : term;


    arg : term| '(' IDENT ':=' term ')';
    binders : binder (binder)*;
    binder : name |<assoc=right>name (name)* ':' term | '(' name (name)* ':' term ')' |<assoc=right> name (':' term)? ':=' term;
    name : IDENT | '_';
    qualid : IDENT | qualid ACCESS_IDENT;
    sort : 'Prop' | 'Set' | 'Type' ;

    /**************************************
    * LEXER RULES
    **************************************/

    /*
    * STRINGS
    */

    STRING : '"' (~["])* '"';
    /*
    * IDENTIFIER AND ACCESS IDENTIFIER
    */
    ACCESS_IDENT : '.' IDENT;
    IDENT : FIRST_LETTER (SUBSEQUENT_LETTER)*;
    fragment FIRST_LETTER :  [a-z] | [A-Z] | '_' | UNICODE_LETTER;
    fragment SUBSEQUENT_LETTER : [a-z] | [A-Z] | DIGIT | '_' | '"' | UNICODE_LETTER | UNICODE_ID_PART;
    fragment UNICODE_LETTER : '\\' 'u' HEX HEX HEX HEX;
    fragment UNICODE_ID_PART : '\\' 'u' HEX HEX HEX HEX;
    fragment HEX : [0-9a-fA-F];

    /*
    * NATURAL NUMBERS AND INTEGERS
    */

    NUM : DIGIT (DIGIT)*;
    INTEGER : ('-')? NUM;
    fragment DIGIT : [0-9];

    WS : [ \n\t\r] -> skip;

如果需要,您可以复制此语法并使用antlr进行测试,它会起作用。现在我的问题: 让我们考虑这样一个表达式: a b - &gt; c d - &gt; forall n:nat,c 。 现在根据我的语法,(&#34; - &gt;&#34;)规则(在forall规则之后)具有最高优先级。 至于这一点,我希望解析这个术语,以便(&#34; - &gt;&#34;)规则位于解析树之上。像这样:Illustrating the parse tree i want(请注意,这是一个抽象的视图,我知道叶子之间有很多上下条款)

但遗憾的是,它并没有以这种方式解析,但这样:Sad truth

解析器如何在解析树之上看不到( - &gt;)规则?这是一个优先问题吗?

1 个答案:

答案 0 :(得分:0)

通过将( arg )规则中的term更改为below_term,我们可以解决问题arg : below_term| '(' IDENT ':=' term ')';

让我们以此表达式为例:a b c。 一旦解析器看到,模式a b匹配此规则:below_term arg (arg)*他将a作为unders_term并尝试将b与arg规则匹配。但是,由于arg现在指向了below_term规则,所以除了括号之外,不允许使用above_term。这解决了我的问题。

术语a b -> a b c -> forall n:nat, n现在以这种方式解析:

enter image description here