Tôi gặp sự cố trong lexer và trong trình phân tích cú pháp của mình.Flex/Bison: Quản lý mã thông báo không hợp lệ?
Thứ nhất, trong lexer của tôi, tôi đã là một dòng như thế:
"if" beginScope(stOTHER); return IF;
Và trong phân tích cú pháp của tôi:
stmt: IF '(' exp ')' stmts
...
stmts: stmt
| '{' stmt_list '}'
| '{' '}'
Trong một mã như thế:
if(sth) {
dosth;
}
if(other) {
doothersth;
}
beginScope sẽ được gọi hai lần, bởi vì (tôi nghĩ) Bison không biết đâu là kết thúc của tuyên bố if
, vì vậy khi nó tìm thấy IF
mã thông báo, ông mất rằng khi kết thúc báo cáo kết quả if
, và đọc nó một lần thứ hai để bắt đầu báo cáo kết quả khác if
...
Xin hãy giúp tôi ...
Bạn có thể gọi 'beginScope()' cho "{" trong tệp Flex của bạn không? Bằng cách đó, bạn có thể 'endScope()' khi bạn thấy "}". Chỉ cần có các biểu thức đơn ký tự này trả về một mã thông báo như OPENBRACE và CLOSEBRACE cho Bison. – chrisaycock
Không, tôi không thể, vì beginScope cần loại tham số và không phải lúc nào cũng có dấu "{" như bạn có thể thấy – gnidmoo
Di chuyển thao tác 'beginScope' vào các hành động phân tích cú pháp của bạn. Sử dụng [hành động quy tắc trung bình] (http://www.gnu.org/software/bison/manual/html_node/Mid_002dRule-Actions.html) nếu cần. Lexer không được có tác dụng phụ, vì chính xác lý do bạn đã phát hiện ra. – zwol