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.
Können Sie Quellen für Ihr Testprogramm angeben? –
Entschuldigung - Ich habe einen Fehler auf der SQLite-Benutzer-Mailingliste (http://www.mail-archive.com/[email protected]/msg99716.html) protokolliert. – carveone