Penso che, analogamente a yacc, i token siano memorizzati in variabili corrispondenti ai simboli nella regola della grammatica. Qui poiché c'è un simbolo (errore), potresti essere in grado di produrre semplicemente $ 1 usando printf
, ecc.
Modifica: rispondere al commento.
Perché si utilizza un terminale di errore? Sto leggendo un tutorial su ocamlyacc che dice che una speciale routine di gestione degli errori viene chiamata quando si verifica un errore di analisi. In questo modo:
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
Beh, sembra che si ottiene solo "Errore di sintassi" con quella funzione però. Restate sintonizzati per maggiori informazioni.
Ottima risposta. Ho una domanda, però: perché dobbiamo usare 'lexbuf.Lexing.lex_curr_p' invece di' lexbuf.lex_curr_p'? – GiantSquid
Poiché 'lex_curr_p' appartiene al modulo' Lexing'. O aprilo o aspetta che OCaml diventi più saggio e capisca i riferimenti ai campi dei record non qualificati. – ygrek
Dove trovi Sql_lexer. ed errore? –