當解析'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或對語法進行調整?
%glr-parser不應該擺脫這個問題;它應該使用它來解析器生成兩個解析。你只需要*一個*解析。 – 2010-12-01 17:33:04