[英]How can I write Bison rule with 0 or 1+ tokens without S/R conflicts?
如果我像正常對象訪問一樣定義了令牌:
[$_a-zA-Z]+[.] { return ACCESS; }
[$_a-zA-Z]+ { return ID; }
[+] { return PLUIS; }
而Bison語法規則:
Accesses
: Accesses ACCESS { /*do something...*/ }
| ACCESS { /*do something...*/ }
Expression
: Accesses ID PLUS Accesses ID { /*do something...*/ }
我想在源代碼中允許這樣的內容:
moduleA.valueB.valueC + valueD
在示例中,如果我沒有在Accesses
放置空規則,則像valueD
這樣的單個ID
變量是非法的。 但是如果我把空規則放進去, Accesses
就會引起嚴重的S / R沖突,而匹配的文本會變得很奇怪。
並且,我不認為復制Expression
的規則是一個好主意,例如:
Expression
: Accesses ID PLUS Accesses ID { /*do something...*/ }
| ID PLUS Accesses ID { /*do something...*/ }
| Accesses ID PLUS ID { /*do something...*/ }
| ID PLUS ID { /*do something...*/ }
我能找到解決這個問題的其他方法嗎?
編輯 :好的,謝謝你的回答注意到我這個簡單的語法沒有沖突。 至少你讓我知道真正的問題可能隱藏在其他地方(對於編譯新手來說真是太糟糕了!)。
你可以這樣做:lex:
[$_a-zA-Z]+ {return WORD;}
"." {return DOT;}
"+" {return PLUS;}
野牛:
Expression : Value PLUS Value;
Value : WORD|WORD AccessList;
AccessElement: DOT WORD;
AccessList : AccessElement|AccessList AccessElement;
在您的示例中使用epsilon生成沒有任何問題:
Expression
: Accesses ID PLUS Accesses ID { /*do something...*/ }
;
Accesses
: Accesses ACCESS { /*do something...*/ }
| { /*do something...*/ }
;
沒有沖突....
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.