[英]Eliminate left-recursion in unambiguous PEG grammar
我已經閱讀了 StackOverflow 上的一堆現有問題,但我無法弄清楚我的語法。
statement "Statement" =
assignment / primitive / reference / operation
operation "Operation" =
statement operator:operator statement
operator "Operator" =
"+"
* 請注意,稍后我可能會在運算符規則中添加更多運算符模式(即“==”、“**”、“/”)。 因此,它可能會變得更加復雜。
我實際上在這里使用PEG.js
而不是普通的 PEG,因此使用了非常規的語法。
編譯器向我抱怨statement
訪問operation
,而后者又訪問statement
等等,這導致了可能的無限循環。 這通常稱為左遞歸。
對於這種特殊情況,我無法理解如何解決此問題。 對於這種情況,我不太了解頭尾模式。
注意:我想盡可能方便地在其他規則中重復使用statement
規則。 因此,將其拆分為十幾個單獨的規則作為一些解決方法可能是一種解決方案,但並不能真正幫助我作為答案。
順便說一下,在10分鍾內了解整個PEG解析架構的朋友的大力幫助下,我能夠解決這個場景的問題。
讓我們問這個:
在
left+right
形式的操作中,我們是否會在left
進行賦值(形式a=b
)或另一個操作(形式a+b
)?
答案很可能是否定的。
因此,這個語法有效:
statement "Statement" =
assignment / operation / primitive / reference
operation "Operation" =
(primitive / reference) operator statement
operator "Operator" =
"+"
如您所見,我只是通過將statement
規則中的primitive / reference
部分替換為某種形式的statement
規則,省略了assignment
和operation
部分,因為我們在左側不需要它們。
這只是解決方案。 它工作正常。
但是,如果您想知道為什么解析像1+2+3+4+5
這樣的輸入是有效的,盡管我們顯然不允許在+
的左側進行遞歸operation
,請注意我們仍然允許它們在右側. 右遞歸在 PEG 中是完全有效的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.