2010-11-12 9 views
12

Tôi đang cố gắng phân tích ngôn ngữ cũ (tương tự như 'C') bằng FLEX và BISON. Mọi thứ đều hoạt động độc đáo ngoại trừ các chuỗi phù hợp.Làm cách nào để viết một trận đấu không tham lam trong LEX/FLEX?

ngôn ngữ di sản khá kỳ quặc này không hỗ trợ trích dẫn các nhân vật trong xâu, vì vậy sau đây là tất cả các xâu hợp lệ:

"hello" 
"" 
"\" 

Tôi đang sử dụng các nguyên tắc sau để phù hợp với xâu:

\".*\"   { yylval.strval = _strdup(yytext); return LIT_STRING; } 

Thật không may đây là một trận đấu tham lam, vì vậy nó phù hợp với mã như sau:

"hello", "world" 

Là một chuỗi đơn (hello", "world).

Định lượng không tham lam thông thường .*? dường như không hoạt động trong FLEX. Bất kỳ ý tưởng?

+0

sức này bạn: http://www.lysator.liu.se/c/ANSI-C-grammar-l.html –

Trả lời

11

Chỉ cấm có báo giá giữa các dấu ngoặc kép.

 
\"[^"]*\" 
+0

Ahhh, tôi đã thử điều đó nhưng tôi đã thoát khỏi dấu ngoặc kép một cách không chính xác trong các dấu ngoặc vuông. Cảm ơn nhiều! – stusmith

+0

Ý tưởng tuyệt vời! Tôi đã nghĩ nếu có một công tắc. – xis

4

Dấu gạch chéo ngược thoát dấu ngoặc kép

Sau đây cũng cho phép nó:

\"(\\.|[^\n"\\])*\" { 
     fprintf(yyout, "STRING: %s\n", yytext); 
    } 

và không cho phép cho dòng mới bên trong các hằng chuỗi.

Ví dụ:

>>> "a\"b""c\d""" 
STRING: "a\"b" 
STRING: "c\d" 
STRING: "" 

và thất bại trên:

>>> "\" 

Khi thực hiện như vậy tính năng C-like, hãy chắc chắn để tìm kiếm việc triển khai Lex hiện có, ví dụ như: lãi http://www.lysator.liu.se/c/ANSI-C-grammar-l.html