2012-05-14 34 views
5

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 ...

+0

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

+0

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

+3

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

Trả lời

1

Khi Zack đề cập trong các nhận xét, bạn nên gọi beginScope từ một hành động phân tích cú pháp:

stmt: IF { beginScope(stOTHER); } '(' exp ')' stmts 
Các vấn đề liên quan