FLEX: Có cách nào để trả lại mã thông báo cùng một lúc


7

Trong flex, tôi muốn trả lại nhiều mã thông báo cho một kết hợp của cụm từ thông dụng. Có cách nào để làm việc này không?

0

Bạn có nghĩa là tất cả các kết quả phù hợp không? Bạn đang sử dụng chức năng regex hoặc chức năng chuỗi? Sử dụng cờ toàn cầu.

Đối với flex, tôi không nghĩ rằng bạn có thể làm điều đó. Bạn thử nghiệm cho phù hợp với một mẫu tại một thời điểm để có thể nằm ngoài phạm vi. Tại sao bạn muốn điều đó? Là một tối ưu hóa? Vấn đề phạm vi?

  0

Thành thật mà nói, tôi khá mới để uốn cong và tôi không chắc chắn. Tôi nghĩ rằng tôi đã sử dụng một sự kết hợp của biểu thức thông thường và phù hợp với chuỗi. Dưới đây là một ví dụ "(" \t \t {return L_PAREN;} { INT} {yylval.Int = atoi (yytext); return INT;} Những gì tôi muốn là để có thể quay trở lại hai thẻ cùng một lúc . 22 feb. 092009-02-22 09:44:23


2

Cách tôi đã thực hiện việc này là tạo hàng đợi mã thông báo trả lại và vào đầu số yylex(), hãy kiểm tra mã thông báo và trả lại chúng.


-1

Thông thường, điều này được xử lý bởi một trình phân tích cú pháp phía trên máy quét cung cấp cho bạn mã sạch hơn nhiều. Bạn có thể mô phỏng ở một mức độ nào đó với các trạng thái:

%option noyywrap 

%top { 
#define TOKEN_LEFT_PAREN 4711 
#define TOKEN_RIGHT_PAREN 4712 
#define TOKEN_NUMBER  4713 
} 

%x PAREN_STATE 
%% 
"("   BEGIN(PAREN_STATE); return TOKEN_LEFT_PAREN; 
<PAREN_STATE>{ 
    [0-9]+ return TOKEN_NUMBER; 
    ")"  BEGIN(INITIAL); return TOKEN_RIGHT_PAREN; 
    .|\n  /* maybe signal syntax error here */ 
} 
%% 
int main (int argc, char *argv []) 
{ 
    int i; 

    while ((i = yylex())) 
    printf ("%d\n", i); 

    return 0; 
} 

nhưng điều này sẽ rất lộn xộn ngay khi ngữ pháp của bạn trở nên phức tạp hơn.