如何使用Bison解析C语言字符串

3

I have a string in a C file like this:

char *test = "print x";

我想使用我编写的Bison解析器进行解析,这是否可能?

很有可能是的。你已经尝试了什么?哪些部分不起作用? - Kninnug
3
您需要配置您的词法分析器,以便它可以从字符串中读取,对其进行分词,并在到达末尾时报告EOF(通过返回值0)。您可能需要一个初始化函数和yylex()代码来从初始化集合中读取。 - Jonathan Leffler
我该怎么做? - tejas
1个回答

4
Bison解析器根本不读取输入。它们只是通过反复调用"yylex"(或者使用现代的bison,您可以创建一个“推动解析器”,该解析器在连续的调用中接收到标记)来获得一系列标记。因此,无论是谁实现了"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);
}

将以下内容放在您的Bison定义文件末尾,再次放置在第二个%%之后:

/* 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来解析字符串。

出现以下错误:error: use of undeclared identifier 'yy_free_buffer' - tejas
1
@TejGop:抱歉,记忆短路了。应该是yy_delete_buffer。已经修正答案。请参考文档 - rici
有没有办法在读取文件的过程中,从字符串中读取内容,而不需要重新启动Bison的解析状态呢?我可以轻松地让flex从字符串中读取,但是当它这样做时,Bison出于某种原因会启动一个全新的解析栈,而不是继续已有的解析栈。 - velocirabbit
@velocirabbit:当然可以,但是你需要提出问题。([问])请展示一下你尝试过的内容。 - rici

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接