Проблемы с приоритетом в грамматике ANTLR4 - PullRequest
0 голосов
/ 17 мая 2018

Я разработал эту маленькую грамматику здесь, у меня проблема с:

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 . Теперь согласно моей грамматике правило ("->") (сразу после правила) имеет самый высокий приоритет. Что касается этого, я хочу, чтобы этот термин был проанализирован так, чтобы оба правила ("->") находились поверх дерева разбора. как это: Illustrating the parse tree i want (Обратите внимание, что это абстрактный вид, я знаю, что между листами есть много терминов выше и ниже)

Однако, к сожалению, это не анализируется так, а так: Sad truth

Почему анализатор не видит правила (->) в верхней части дерева разбора? Это проблема приоритета?

1 Ответ

0 голосов
/ 19 мая 2018

Изменив термин на under_term в правиле ( arg ), мы можем решить проблему arg : below_term| '(' IDENT ':=' term ')';.

Давайте возьмем это выражение в качестве примера: a b c. Как только синтаксический анализатор увидит, что шаблон a b соответствует этому правилу: below_term arg (arg)* он помещает a в качестве under_term и пытается сопоставить b с правилом arg. Однако, так как arg теперь указывает на правило under_term, никакие выше_термы не допускаются, за исключением случаев, когда они заключены в скобки. Это решило мою проблему.

Термин a b -> a b c -> forall n:nat, n теперь анализируется следующим образом:

enter image description here

...