2016-10-07 4 views
0

Dies könnte mein Missverständnis sein, wie Parser eher reduzieren als einen möglichen Fehler in SQLite Zitronen Parser. Ich habe mit einfachen Grammatiken für eine Datenbank-Eingabedatei experimentiert. Die Datenbank besteht aus einer Liste von mindestens einem Eintragssätze, Dinge wie "Befehle" oder "Karten" oder ...Lemon Parser Assertion fehlgeschlagen, wenn ein Set nur einen Eintrag hat

Hier ist eine Grammatik, die nicht funktioniert - ich habe angefangen, die Eintragsgruppen und bisher alle zu erstellen ich habe ein „Befehl“:

database ::= entrylist. 

entrylist ::= entrylist entryset. 
entrylist ::= entryset. 

entryset ::= command. 

/* Commands are in the form %command [arguments] \n */ 

command ::= CMDNAME cmdargs EOL. 
cmdargs ::= cmdargs cmdarg. 
cmdargs ::= . 

cmdarg ::= INTEGER. 
cmdarg ::= TEXT. 

Wenn ich das mit einem Testprogramm ausführen, das nur in Token-Feeds erhalte ich:

$ test 
Debug: Input 'CMDNAME' 
Debug: Shift 'CMDNAME', go to state 3 
Debug: Return. Stack=[CMDNAME] 
Debug: Input 'INTEGER' 
Assertion failed: stateno <= YY_SHIFT_COUNT, file testpar.c, line 513 

Wenn ich gebe dem entrySet eine weitere Alternative:

entryset ::= command. 
entryset ::= map. 
... 
map ::= MAPNAME EOL. 

dann funktioniert das Ganze wie erwartet. Ich denke, vielleicht ist es nicht erlaubt, eine Situation zu schaffen, in der a :: = b und b :: = c. Sie müssen b :: = c | haben d mindestens. Ich würde gerne verstehen, wenn das mein Fehler beim Verständnis ist.

+0

Können Sie Quellen für Ihr Testprogramm angeben? –

+0

Entschuldigung - Ich habe einen Fehler auf der SQLite-Benutzer-Mailingliste (http://www.mail-archive.com/[email protected]/msg99716.html) protokolliert. – carveone

Antwort

1

Lemon komprimiert den Verschiebetisch Standardaktionen aus dem Ende der Tabelle zu entfernen. Vermutlich sollten Standardaktionen anderswo behandelt werden, sind es aber nicht. Ihr Beispiel verfügt über Standardaktionen, so dass die Tabelle komprimiert ist, YY_MAX_SHIFT und YY_SHIFT_COUNT nicht synchronisiert sind und die Bestätigung ausgelöst wird.

In lemon.c, um die Linie 4235, können Sie diese Zeile aus kommentieren:

while(n>0 && lemp->sorted[n-1]->iTknOfst==NO_OFFSET) n--; 

Kompression zu verhindern und um den Fehler zu verhindern.

generierte Code mit Kompression:

#define YY_MAX_SHIFT   3 
#define YY_SHIFT_COUNT (2) 
#define YY_SHIFT_USE_DFLT (13) 
static const unsigned char yy_shift_ofst[] = { 
/*  0 */  7, 1, 6, 
}; 

generierte Code ohne Komprimierung:

#define YY_MAX_SHIFT   3 
#define YY_SHIFT_COUNT (3) 
#define YY_SHIFT_USE_DFLT (13) 
static const unsigned char yy_shift_ofst[] = { 
/*  0 */  7, 1, 6, 13, 
}; 

legte ich die Details in der SQLite-Mailingliste früher in diesem Jahr, aber noch ist nichts passiert ist. Die richtige Lösung besteht wahrscheinlich darin, die Komprimierung fortzusetzen, aber Standardaktionen in der Vorlage zu bearbeiten.

Verwandte Themen