[英]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.