Tôi nghĩ rằng, tương tự như yacc, các mã thông báo được lưu trữ trong các biến tương ứng với các ký hiệu trong quy tắc ngữ pháp của bạn. Ở đây vì có một biểu tượng (lỗi), bạn có thể chỉ cần đầu ra $ 1 bằng cách sử dụng printf
, v.v.
Chỉnh sửa: trả lời nhận xét.
Tại sao bạn sử dụng thiết bị đầu cuối lỗi? Tôi đang đọc một hướng dẫn ocamlyacc nói rằng một thói quen xử lý lỗi đặc biệt được gọi khi một lỗi phân tích cú pháp xảy ra. Cũng giống như vậy:
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
Vâng, có vẻ như bạn chỉ nhận được "lỗi cú pháp" với chức năng mặc dù. Hãy theo dõi để biết thêm.
Câu trả lời hay. Tôi có một câu hỏi, mặc dù: tại sao chúng ta phải sử dụng 'lexbuf.Lexing.lex_curr_p' thay vì' lexbuf.lex_curr_p'? – GiantSquid
Vì 'lex_curr_p' thuộc về mô-đun 'Lexing'. Hoặc mở nó hoặc chờ cho đến khi OCaml trở nên khôn ngoan hơn và hiểu được các tham chiếu trường không đủ tiêu chuẩn. – ygrek
Nơi nào bạn tìm thấy Sql_lexer. và Lỗi? –