Ich denke, dass die Token ähnlich wie yacc in Variablen gespeichert sind, die den Symbolen in Ihrer Grammatikregel entsprechen. Hier, da es ein Symbol (Fehler) gibt, können Sie möglicherweise $ 1 ausgeben, indem Sie printf
, etc.
Edit: Reagieren auf Kommentar.
Warum verwenden Sie ein Fehlerterminal? Ich lese ein ocamlyacc-Tutorial, das besagt, dass eine spezielle Fehlerbehandlungsroutine aufgerufen wird, wenn ein Parse-Fehler auftritt. Wie so:
3.1.5. The Error Reporting Routine
When ther parser function detects a syntax error, it calls a function named parse_error
with the string "syntax error" as argument. The default parse_error
function does nothing and returns, thus initiating error recovery (see Error Recovery). The user can define a customized parse_error function in the header section of the grammar file such as:
let parse_error s = (* Called by the parser function on error *)
print_endline s;
flush stdout
Nun sieht, wie du nur wenn mit dieser Funktion "Syntaxfehler" erhalten. Bleiben Sie dran für weitere Informationen.
Große Antwort. Ich habe jedoch eine Frage: Warum müssen wir 'lexbuf.Lexing.lex_curr_p' anstelle von' lexbuf.lex_curr_p' verwenden? – GiantSquid
Weil 'lex_curr_p' zum' Lexing' Modul gehört. Öffnen Sie es oder warten Sie, bis OCaml weiser wird und nicht qualifizierte Feldreferenzen kennt. – ygrek
Wo finden Sie Sql_lexer? und Fehler? –