在分析过程中,如果遇到包含令牌,我想指示YACC打开指定为输入的文件并开始解析。一旦这个解析完成,我想要指示YACC返回到文件并在include表达式之后直接继续解析。我将限制包含深度级别为1。如何使用Flex和YACC实现#include构造?
10
A
回答
6
flex手册介绍了如何使用yypush_buffer_state()和yypop_buffer_state()来执行此操作。 Here是使用多个输入缓冲区的手册部分。有一些示例代码。
4
在处理器的词法和句法阶段之间进行通信是正常的。
因此,要在解析器中识别include指令的语法(或者为了简化起见,只需在词法分析器中识别它)并在词法级别进行切换即可。
例如,下面是一个简单的语言,用于识别包含ab
或cd
或.file
的标准输入行。当它看到.someString
它将someString
作为包含文件打开,然后返回到读取标准输入。
%{
#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;
}
当我们运行...
$ 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
$
相关问题
- 1. 我如何实现lex和yacc
- 2. 使用Flex(法)和野牛(YACC)
- 3. 使用flex和yacc的整数令牌
- 4. Flex和Yacc语法问题
- 5. 如何在实现文件中使用构造函数?
- 6. “类”常量和构造函数:如何实现?
- 7. 使用lex和yacc
- 8. 如何使用setInterval和构造函数?
- 9. 生成文件的YACC和Flex
- 10. 如何使用/从构造
- 11. 如何使用构造gem
- 12. 如何让yacc/bison和lex/flex暂停文件扫描?
- 13. 如何配置流利NHibernate使用IoC构造器注入(非空构造函数)的IUserType实现
- 14. 如何使Java和Flex实时连接?
- 15. 如何用PHP和Flex实现虚拟文件系统?
- 16. 如何用Java hibernate和JPA的后端实现Flex前端?
- 17. 在构造函数中使用参数实现控制器
- 18. 构造函数实现丢失
- 19. 没有构造DbRepository实现在子类
- 20. 如何在使用yacc构建符号表时考虑范围?
- 21. 如何使用TweenLite实现Flex的PopUpManager的效果?
- 22. Flex:如何通过使用接口实现松耦合?
- 23. 如何在Visual Basic中实现类构造函数?
- 24. 如何实现我的构造,其中从Command.php
- 25. 带构造函数的Typescript接口 - 如何实现?
- 26. 如何在UML中绘制实现构造型?
- 27. 如何实现构造函数扩展类
- 28. 如何在Swift子类中实现复制构造函数?
- 29. 如何在Typescript中实现无原型构造函数?
- 30. 我将如何构造这个数据库来实现功能?
DigitilRoss'答案是彻底的,并不够准确。但是最佳实践胜过任何一天的聪明。我在18分钟前看到了这个,现在我已经开始工作了。感谢您的链接。 +1 – Jamie 2011-12-20 04:49:10