2010-11-19 23 views
1

Kodumun sınıf bölümünde, bir hata yazarsam, hata yapmaması gereken birkaç satır hata olarak bildirilir. Hatalardan kurtarmanın iyi/güvenli olduğu belirli yerlerde '| error' koydum ama onu kullanmıyor sanırım. Belki bir yerde orta ifadeye devam etmeye çalışıyordur?bizmeme: bir hata ek hataya neden olur ama hatalı hata

Bison'u belirlenen konumlarda kurtarmayı denemem için bir yol var mı? Nasıl çalışır ve yanlış ne yapabilirim?

Döngüün yanındaki hata satırını koydum.

SomeRuleLoop: 
    | Rule ',' SomeRuleLoop 
Rule: 
     A 
    | B 
    | C 
    | Error 
A: 
     AA AAB AABC 
    | AA AAB AABC Z 
... 
İşte

Adetlerimden bir örnektir: İşte bir örnek. Konsolumda "funcBody hatası" görüyorum ancak bir sonraki satır ilk hata nedeniyle hata alıyor. Her funcBodyRule bağımsız olsa da.

funcBodyLoop: 
    | funcBodyLoop funcBody 

funcBody: 
     funcBodyRule 
    | error { printf("funcBody error"); $$=0; } 
    | '#' EQ { printf("still in funcBody\n"); $$=0; } 

Birinci hatayı ve 2. satırı olan satırı arasına # == yazmayı denedim. Ayrıştırıcının hala funcbody döngüsünde olup olmadığını kontrol etmek için bunu yazdım. Bu bir hata vermez, bu nedenle . Nevermind ben bir printf ekledim ve dize basılmadı, bu yüzden artık fonksiyon döngüsünde değil mi? Bunu nasıl düzeltirim?

+0

Bize yardımcı olmak için bazı kodlar olmadan çok fazla yardımcı olmak imkansız olacak. ** Ama ** minimum kodlara yakın olmalı, birkaç yüz satır değil. –

+0

@Jonathan Leffler: Döngünün nerede olduğu. Sorgumu değiştirdim –

+0

Yacc (Bison) 'un büyük/küçük harfe duyarlı olduğunu biliyorsunuz, bu yüzden' Error 'seçeneğiyle' error '(' built in '(yerleşik) olan ve belirli bir anlamı olan w.r.t hatası kurtarma) ile aynı şey değil. –

cevap

0

... Başınıza geri kalanı ne olduğundan emin değilim ';' veya hatanın sonunda yeni satırlar bunu çözer. (yerine | error)

1

Yacc ve Bison, normalde sol - özyinelemeli kurallar kullanır ve gösterilen kurallar geriye doğru değildir. Bu 'SomeRuleLoop' jeton boş bir dize veya ardından 'Kural' ya olduğunu söyler sağ özyinelemeli kuraldır

SomeRuleLoop: 
     /* Nothing */ 
    | Rule ',' SomeRuleLoop 
    ; 

:

görüldüğü gibi

, ilk kural eşdeğerdir virgül ve biraz daha 'SomeRuleLoop'. Bunun bir 'SomeRuleLoop' ifadesinin virgülle sona erdiğini ve muhtemelen aklınızda olan şey olmadığını unutmayın.


(/ çatışmaları azaltmak fazla vardiya) ama her yerde ekleyerek dilbilgisi belirsiz hale getirmek eğilimindedir - Boş alternatifleri sağlayan önemli olduğunu

SomeRuleLoop: 
     Rule 
    | SomeRuleLoop ',' Rule 
    ; 

Not:

ilk kuralı muhtemelen okumalısınız

Ayrıca, hata giderme işleminin gerçekleşebileceği bir noktayı belirtmek için 'Hata' (karışık durum) yerine 'hata' belirtecini (tüm küçük harf) kullanmanız gerekir.

Ancak, zorlama

+0

Bekleyin, bekle beni şaka ediyorsun. Sol özyineli mi? Doğru özyinelemeli değil mi? Evet, bunu yanlış yapıyorum. Bu, hata sorununu düzeltebilir. Her şeyi tamir ettiğimde yorum yapacağım –

+0

Kafam çok karışık. Sola bırakılacak kuralları değiştirdim. Hata mesajımın yazdırıldığını görüyorum. Yine de hala bir hata alıyorum. Soruyu güncelledim –

İlgili konular