2010-02-16 23 views
10

Trong khi phân tích cú pháp, nếu tôi gặp phải mã thông báo bao gồm, tôi muốn hướng dẫn YACC mở tệp được chỉ định làm đầu vào và để bắt đầu phân tích cú pháp này. Khi việc phân tích cú pháp này kết thúc, tôi muốn hướng dẫn YACC quay lại tệp và tiếp tục phân tích trực tiếp sau biểu thức bao gồm. Tôi sẽ hạn chế mức độ sâu bao gồm một.Tôi có thể triển khai #include các cấu trúc bằng Flex và YACC như thế nào?

Trả lời

6

Hướng dẫn sử dụng flex bao gồm cách thực hiện điều này bằng yypush_buffer_state() và yypop_buffer_state(). Here là phần của hướng dẫn sử dụng nhiều bộ đệm đầu vào. Có một số mã mẫu.

+0

DigitilRoss' Câu trả lời là kỹ lưỡng, và đủ chính xác. Nhưng thực hành tốt nhất giành chiến thắng thông minh hơn bất kỳ ngày nào. Tôi thấy điều này 18 phút trước và bây giờ tôi đã làm việc bao gồm. Cảm ơn các liên kết. +1 – Jamie

4

Việc giao tiếp giữa các giai đoạn từ vựng và cú pháp của bộ xử lý là điều bình thường.

Vì vậy, hãy nhận biết cú pháp cho chỉ thị bao gồm trong trình phân tích cú pháp của bạn (hoặc để dễ dàng hơn, chỉ cần nhận dạng nó trong từ khóa) và thực hiện chuyển đổi ở cấp từ vựng. Ví dụ:

Ví dụ: đây là ngôn ngữ đơn giản nhận dạng các dòng nhập chuẩn chứa ab hoặc cd hoặc .file. Khi nó thấy .someString, nó sẽ mở ra someString dưới dạng tệp bao gồm và sau đó quay lại đọc đầu vào tiêu chuẩn.

%{ 
#include <stdio.h> 
#include <stdlib.h> 
void start_include(char *); int yylex(void); void yyerror(void *); 
#define YYSTYPE char * 
%} 
%% 
all:   all others | others; 
others:  include_rule | rule_1 | rule_2 | 'Z' { YYACCEPT; }; 
include_rule: '.' '\n' { start_include($1); }; 
rule_1:  'a' 'b' '\n' { printf("random rule 1\n"); }; 
rule_2:  'c' 'd' '\n' { printf("random rule 2\n"); }; 
%% 
FILE * f = NULL; 
void start_include(char *s) { 
     if ((f = fopen(s, "r")) == NULL) 
       abort(); 
} 
int yylex(void) { 
     int c; 
     static char s[100]; 
     if (f == NULL) 
       f = stdin; 
     c = getc(f); 
     if (c == EOF) { 
       f = stdin; 
       c = getc(f); 
     } 
     if (c == '.') { 
       scanf(" %s", s); 
       yylval = s; 
     } else if (c == EOF) 
       return 'Z'; 
     return c; 
} 

Và khi chúng ta chạy nó ...

$ cat > toplevel 
ab 
.myinclude 
ab 
$ cat > myinclude 
cd 
cd 
$ yacc ip.y && cc -Wall y.tab.c -ly && ./a.out < toplevel 
random rule 1 
random rule 2 
random rule 2 
random rule 1 
$ 
Các vấn đề liên quan