簡體   English   中英

ANTLR4語法中的優先級問題

[英]Problems with precedence in ANTLR4 Grammar

我在這里開發了這個小語法,但我遇到了一個問題:

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對其進行測試,它將起作用。 現在是我的問題:讓我們考慮這樣的表達式: ab-> cd-> forall n:nat,c 現在,根據我的語法, (“->”)規則(緊隨forall規則之后)具有最高優先級。 為此,我希望對該術語進行解析,以便兩個(“->”)規則都位於解析樹的頂部。 像這樣: 說明我想要的解析樹 (請注意,這是一個抽象視圖,我知道葉子之間有很多上下術語)

但是可悲的是,它不是通過這種方式來解析的,而是通過這種方式: 可悲的真相

解析器如何在解析樹的頂部都看不到(->)規則? 這是優先事項嗎?

通過將( arg )規則中的term更改為below_term,我們可以解決問題arg : below_term| '(' IDENT ':=' term ')'; arg : below_term| '(' IDENT ':=' term ')';

讓我們以以下表達式為例: abc 一旦解析器看到了,則模式ab匹配以下規則: below_term arg (arg)*他將a用作below_term,並嘗試將b與arg規則匹配。 但是,由於arg現在指向了below_term規則,因此除非將大括號括起來,否則不會禁止upper_term。 這解決了我的問題。

術語ab -> abc -> forall n:nat, n現在以這種方式解析ab -> abc -> forall n:nat, n

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM