Ich habe ein Frontend in menhir
geschrieben, die versucht, einen Ausdruck zu analysieren: von einer Zeichenfolge zu einem Ausdruck AST. Der Einstiegspunkt des Frontends Parser_e.main
wird an verschiedenen Stellen in meinem OCaml-Code aufgerufen. Ich möchte also mögliche Fehler innerhalb des Frontends eher als außerhalb wahrnehmen können. Wenn ich einen Fehler erhalte, ist eine bestimmte wichtige Information, die ich zeigen möchte, die gesamte Eingabezeichenfolge, die das Frontend nicht analysieren kann. (Fehler vom Lexer sind sehr selten, weil das Frontend fast alles lesen kann).Erhalten Sie die Eingabezeichenfolge, die Parsing-Fehler im Parser löst
Also habe ich versucht, this thread zu folgen, und um mehr Informationen zu drucken, wenn ein Fehler vorliegt. In parser_e.mly
habe ich
exception LexErr of string
exception ParseErr of string
let error msg start finish =
Printf.sprintf "(line %d: char %d..%d): %s" start.pos_lnum
(start.pos_cnum - start.pos_bol) (finish.pos_cnum - finish.pos_bol) msg
let parse_error msg nterm =
raise (ParseErr (error msg (rhs_start_pos nterm) (rhs_end_pos nterm)))
e_expression:
/* empty */ { EE_empty }
| INTEGER { EE_integer $1 }
| DOUBLE { EE_double $1 }
...
| error { parse_error "e_expression" 1; ERR "" }
hinzugefügt Aber es hat noch nicht die Eingabestring als Information. Hat jemand, wenn es irgendeine Funktion gibt, die ich vermisse, um das zu bekommen?
eine Zeichenfolge Linie Gegeben Als Eingabe geben Ihre Funktionen die genaue ** Teilzeichenfolge ** zurück, die Fehler verursacht, während ich gefragt habe, wie die gesamte Eingabezeichenfolge angezeigt werden soll. Aber ich denke, meine anfängliche Frage ist ziemlich einfach: Wir könnten einfach eine Fehlerbehandlung um 'Parser_e.main' oder' Parse.statement' wickeln und immer den Wrapper aufrufen ... Gut zu wissen, welches Beispiel und Modul genauer ist .. – SoftTimur
Dies ist nicht möglich, da der Parser es nicht selbst kennt. Im Moment des Scheiterns befindet es sich in einem Zustand, in dem es keine Übergänge mehr gibt. Die Geschichte, wie es in diesem Zustand gelandet ist, wird nicht gespeichert. Sie können den Debugging-Modus aktivieren und dieses Protokoll drucken, aber das unterscheidet sich von einem netten Parser-Fehler für einen Endbenutzer. – ivg