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?
10
A
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.
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
- 1. Các cấu trúc lớn có thể được truyền bằng giá trị hiệu quả như thế nào?
- 2. Cấu trúc và triển khai ứng dụng web
- 3. Làm thế nào tôi có thể khai báo mảng trong cấu trúc?
- 4. Facebook có thể được triển khai trong Adobe Flex không?
- 5. Làm cách nào để triển khai hai cấu trúc có thể truy cập lẫn nhau?
- 6. Tôi nên triển khai các tiểu trình con "lồng nhau" bằng Python như thế nào?
- 7. Tôi có thể triển khai So sánh nhiều lần như thế nào?
- 8. Atan2 được triển khai bằng .NET như thế nào?
- 9. Phương thức "công khai/được bảo vệ/riêng tư" được triển khai như thế nào và tôi có thể mô phỏng nó như thế nào?
- 10. Khi làm việc với AppHarbor, tôi có thể quản lý đúng cách các tệp cấu hình phát triển và cấu hình trực tiếp như thế nào?
- 11. WPF - Làm cách nào để tôi có thể triển khai ObservableCollection <K,T> bằng khóa (như từ điển)?
- 12. Phạm vi Lexical được triển khai như thế nào?
- 13. Tích hợp Bison/Flex/Yacc vào XCode
- 14. Các chỉ mục thông thường và tổng hợp được triển khai trong RDB như thế nào?
- 15. HttpSession được triển khai như thế nào?
- 16. Các mutex được triển khai như thế nào?
- 17. OpenID được triển khai như thế nào?
- 18. GMail triển khai Comet như thế nào?
- 19. Máy tính Google được triển khai như thế nào?
- 20. Cấu trúc dữ liệu có thể phát triển trong MATLAB
- 21. Các mảng được triển khai trong Perl như thế nào?
- 22. Tôi nên cấu trúc các dự án phức tạp như thế nào trong C?
- 23. Tôi có thể xử lý các phiên web bằng CGI :: Session bằng Perl như thế nào?
- 24. Thuật toán và cấu trúc dữ liệu triển khai cho các lập trình C
- 25. Các tham chiếu yếu được triển khai như thế nào?
- 26. Bản đồ băm JavaScript được triển khai như thế nào?
- 27. Các mảng được triển khai trong java như thế nào?
- 28. Triển khai tốt Cấu trúc ứng dụng JavaScript có thể mở rộng (Sandbox by Nicholas Zakas)?
- 29. Tôi nên chỉ định loại dữ liệu không có cấu trúc giống như JSON trong Scala như thế nào?
- 30. Cây triển khai và cấu trúc dữ liệu khác với ruby
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