Permalänk
Medlem

Felåterhämtning i YACC/Bison

Jag håller på att skriva en enkel parser i Bison/FLEX men det var ett tag sedan senast så det mesta är borta. Problemet jag har är att jag ska parsa lite output från ett program, men det är egentligen bara 3 av flera möjligheter som är intressanta. Jag har just nu regler som ser ut så här:

start: list ; list: r1 list | r2 list | r3 list | /* EMPTY */ ; r1: NUM NUM NUM tR1 NUM PROT tFROM NUM tTO NUM DIR { /*Do something*/ } ; r2: NUM NUM NUM tR2 NUM PROT tFROM NUM tTO NUM DIR { /*Do something*/ } ; r3: NUM NUM NUM rR3 PROT tFROM NUM tTO NUM DIR { /*Do something*/ } ; (+ några regler som t.ex. NUM som matchar ett nummer och returnerar värdet via $$)

Problemet är som sagt att det finns en hel hög med andra potentiella regler som inte är helt triviala att parsa, men jag är inte intresserade alls av dom. Egentligen så är det enda som behövs att parsa tills man vet att ingen av reglerna ovan matchar, och då kasta bort alla tokens tills man kommer till en nyrad (eventuellt skriva ut att en regel inte parsades) och då börja om. Jag har ett vagt minne av att man ska kunna göra det (har för mig att jag hoppade till semikolon någon gång), men jag kan inte komma ihåg hur. Det enda jag kan hitta nu är något om ett "error" token som finns, men jag förstår nte riktigt hur jag skulle hantera det här. Någon som har koll på Bison?

Permalänk
Glömsk

Lite exempel här Bison 1.25 - Examples

Visa signatur

...man is not free unless government is limited. There's a clear cause and effect here that is as neat and predictable as a law of physics: As government expands, liberty contracts.

Permalänk
Medlem

Tja, jag känner mig jävligt blond just nu. Har som sagt sett exempel med det inbyggda error tokenet (eller hur man nu ska böja det på svenska) tidigare men fattade inte. Läste snabbt igenom sidan du länkade till och inget nytt där, men det klickade på en sekund när jag kom till felhanteringen. Det är ju bara att säga att r1, r2 och r3 kan vara det som står ovan ELLER error. Nåja, det fungerar i alla fall. Tackar.