如何用 Bison 解析 C 字符串
How to parse a C string with Bison
我在 C 文件中有一个这样的字符串:
char *test = "print x";
我想用我编写的 Bison 解析器解析它。可能吗?
Bison 解析器根本不读取输入。他们只是通过重复调用 yylex
来获得一系列令牌。 (或者,对于现代野牛,您可以创建一个 "push parser" ,它在连续的调用中被赋予标记。)所以无论什么实现 yylex
都负责输入。
如果你使用flex
创建一个词法扫描器,你可以使用yy_scan_string
(或者yy_scan_bytes
如果你知道字符串有多长)来扫描一个字符串而不是扫描从一个文件。有关这些功能的详细信息,请参阅 Flex manual。
举个简单的例子,您可以将以下两个函数放在 flex
定义文件的末尾,在第二个 %%
:
之后
void set_input_string(const char* in) {
yy_scan_string(in);
}
void end_lexical_scan(void) {
yy_delete_buffer(YY_CURRENT_BUFFER);
}
并将其放在你的野牛定义文件的末尾,再次放在第二个 %%
:
之后
/* Declarations */
void set_input_string(const char* in);
void end_lexical_scan(void);
/* This function parses a string */
int parse_string(const char* in) {
set_input_string(in);
int rv = yyparse();
end_lexical_scan();
return rv;
}
然后你可以声明并使用parse_string
来解析一个字符串。
我在 C 文件中有一个这样的字符串:
char *test = "print x";
我想用我编写的 Bison 解析器解析它。可能吗?
Bison 解析器根本不读取输入。他们只是通过重复调用 yylex
来获得一系列令牌。 (或者,对于现代野牛,您可以创建一个 "push parser" ,它在连续的调用中被赋予标记。)所以无论什么实现 yylex
都负责输入。
如果你使用flex
创建一个词法扫描器,你可以使用yy_scan_string
(或者yy_scan_bytes
如果你知道字符串有多长)来扫描一个字符串而不是扫描从一个文件。有关这些功能的详细信息,请参阅 Flex manual。
举个简单的例子,您可以将以下两个函数放在 flex
定义文件的末尾,在第二个 %%
:
void set_input_string(const char* in) {
yy_scan_string(in);
}
void end_lexical_scan(void) {
yy_delete_buffer(YY_CURRENT_BUFFER);
}
并将其放在你的野牛定义文件的末尾,再次放在第二个 %%
:
/* Declarations */
void set_input_string(const char* in);
void end_lexical_scan(void);
/* This function parses a string */
int parse_string(const char* in) {
set_input_string(in);
int rv = yyparse();
end_lexical_scan();
return rv;
}
然后你可以声明并使用parse_string
来解析一个字符串。