2010-12-01 58 views
3

當解析'if' expr 'then'時,我有一種語法有兩種不同的可能性。有一個簡單的「任務」,如if foo then bar=1; else bar=0;再有就是我打電話的代碼「if_block」,它可以包含一個或多個「分配」:解決模糊語法而不訴諸於GLR解析器

if foo then 
{ 
    bar = 1; 
    if xyz then abc = -1; 
} 
else 
{ 
    bar = 0; 
    if xyz then 
    { 
     abc = 0; 
    } 
} 

我通過的方式處理嵌套if_blocks dangling else匹配/不匹配的塊。

我(非常簡化)語法基本是:

program : if_blocks 
if_blocks : if_block | if_block if_blocks 
if_block : assignments 
assignments : assignment | assignment assignments 
assignment : simple_assignment | if_assignment 

所以我的困境是與分配後跟if_block。例如:

foo = bar; 
if foo then 
{ 
    foo = foo + 1; 
} 

foo = bar;是,在這種情況下,應減少到一個if_block的分配。 if foo then { ... }本身就是一個if_block。因此,這整個代碼是if_block + if_block(簡化爲if_blocks)。但是在將foo = bar;簡化爲賦值之後,沒有足夠的前瞻知道if foo then是否是另一個賦值(在foo = bar; if_block中)或者它是否是單獨的if_block。

我已經添加了%glr-parser,這似乎解決了這個問題,但是我遇到了其他多個解析分支存活的情況,我似乎無法調和不同的S/R分支。對於這種情況,如果沒有切換到完全不同的掃描器/解析器(這對於我學習和重寫代碼會有很多工作)或更改語言(我不能這麼做),那麼對於這種情況,接受的做法是什麼?是否有一個簡單的解決方案(用%dprec定義?)使用GLR或對語法進行調整?

+0

%glr-parser不應該擺脫這個問題;它應該使用它來解析器生成兩個解析。你只需要*一個*解析。 – 2010-12-01 17:33:04

回答

1

經典的懸空-其他問題通過堅持一個別的連接到最近的解決如果,其(在概念上)解決該不確定性。不知何故,你需要將這個想法傳達給解析器生成器,以使模糊性真正消失。

大多數解析器生成器(包括YACC和Bison)都有某種說法,當對於令牌存在shift-vs-reduce衝突時,更喜歡「shift」,它可以用於準確地達到否則關鍵字。我不知道YACC或Bison的成語是什麼,但應該很容易在語法描述信息中找到。 (我使用我自己的GLR解析器,並且它仍然很有用,因爲它以簡單的方式擺脫了模糊的解析)。