簡體   English   中英

將C語法轉換為LL(1)

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM