在解析过程中,如果我遇到包含标记,我想指示 YACC 打开指定为输入的文件并开始解析它。一旦这个解析完成,我想指示 YACC 返回文件并在包含表达式之后直接继续解析。我会将包含深度级别限制为 1。
问问题
4009 次
2 回答
9
flex 手册介绍了如何使用 yypush_buffer_state() 和 yypop_buffer_state() 执行此操作。
这是官方手册中关于使用多个输入缓冲区的部分。有一些示例代码。
于 2010-02-16T00:49:58.710 回答
5
在处理器的词汇和句法阶段之间进行通信是正常的。
所以,在你的解析器中识别包含指令的语法(或者,为了让事情更容易,只需在词法分析器中识别它)并在词法级别进行切换。
例如,这是一种简单的语言,可以识别包含ab
orcd
或的标准输入行.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
$
于 2010-02-16T01:46:00.657 回答