【问题标题】:Problems with precedence in ANTLR4 GrammarANTLR4 语法中的优先级问题
【发布时间】:2018-05-17 09:18:10
【问题描述】:

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

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 -> c d -> forall n:nat, c。 现在根据我的语法 ("->") 规则(在 forall 规则之后)具有最高优先级。 至于这个,我希望解析这个术语,以便 ("->") 规则都在解析树的顶部。像这样:(请注意,这是一个抽象视图,我知道叶子之间有很多上下术语)

但遗憾的是,它没有以这种方式解析,而是以这种方式解析:

为什么解析器看不到解析树顶部的 (->) 规则?这是优先问题吗?

【问题讨论】:

  • 对不起我的无知,但对我来说结果树看起来很像你想要的。您有above_term:13(这将是您绘图中的根项),然后是below_term:1-&gt;above_term:1,它们对应于绘图中的第二行。那么想要改变的是什么?
  • 如果你想在同一个根下匹配ab,何不试试below_term中的qualid+
  • 大家好,感谢您提供的帮助。 Mike:我希望 b 匹配树中相同的高度,因为 (->) 在我的表达式中分隔了三个块。巴特这有一点帮助。但是,我找到了解决此问题的方法,我将很快发布答案

标签: parsing antlr antlr4 operator-precedence


【解决方案1】:

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

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

术语 a b -&gt; a b c -&gt; forall n:nat, n 现在被这样解析:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多