[英]Convert C- grammar to LL(1)
我目前正在為C-構建編譯器。 我目前正在分析器上工作,由於某種原因,我似乎無法解決源自EXPRESSION生產的(終端ID)第一集沖突。 下面是我現在擁有的語法的子集,有人可以為我指出解決沖突的正確方向(或轉換為等效的LL(1)可解析語法)。
EXPRESSION -> id VAR eq EXPRESSION | SIMPLEEXPRESSION
VAR -> lbracket EXPRESSION rbracket | empty
SIMPLEEXPRESSION -> ADDITIVEEXPRESSION FADDITIVEEXPRESSION
FADDITIVEEXPRESSION -> RELOP ADDITIVEEXPRESSION | empty
RELOP -> ltoreq | lt | gt | gtoreq | doubleeq | noteq
ADDITIVEEXPRESSION -> TERM ADDITIVEEXPRESSION1
ADDITIVEEXPRESSION1 -> ADDOP TERM ADDITIVEEXPRESSION1 | empty
ADDOP -> plus | minus
TERM -> FACTOR TERM1
TERM1 -> MULOP FACTOR TERM1 | empty
MULOP -> times | divide
FACTOR -> lparen EXPRESSION rparen | id FACTOR1 | num
FACTOR1 -> a | b
C本身無法很好地進行LL(1)解析,因此您在此處嘗試執行的操作可能非常難以實現,甚至對於完整的語法而言也可能無法實現。
但是對於眼前的問題,對於頂級生產
EXPRESSION -> id VAR eq EXPRESSION | SIMPLEEXPRESSION
很容易看到id
可以是任一選擇的開始,因此LL(1)解析器將不知道選擇哪個選擇。
解決當前問題的一種方法是將EXPRESSION
生產分成兩種選擇,一種總是以id
終端開頭,而另一種則永遠不會:
EXPRESSION -> EXPRESSION_id | EXPRESSION_non_id
對於id
替代方案,我們需要先使用id
終端,然后創建隨后的生產的僅id
版本:
EXPRESSION_id -> id (VAR eq EXPRESSION | SIMPLEEXPRESSION_id)
同樣,對於非id
方面,我們將創建以下產品的非id
版本:
EXPRESSION_non_id -> SIMPLEEXPRESSION_non_id
完成語法所需的子作品看起來像這樣:
SIMPLEEXPRESSION_id -> ADDITIVEEXPRESSION_id FADDITIVEEXPRESSION
ADDITIVEEXPRESSION_id -> TERM_id ADDITIVEEXPRESSION1
TERM_id -> FACTOR_id TERM1
FACTOR_id -> FACTOR1
SIMPLEEXPRESSION_non_id -> ADDITIVEEXPRESSION_non_id FADDITIVEEXPRESSION
ADDITIVEEXPRESSION_non_id -> TERM_non_id ADDITIVEEXPRESSION1
TERM_non_id -> FACTOR_non_id TERM1
FACTOR_non_id -> lparen EXPRESSION rparen | num
您可以對其他沖突進行類似的轉換,但是生成的語法可能會變得很笨拙。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.