2016-08-24 54 views
1

我有一个C文件中像这样的字符串:如何解析C字符串与野牛

char *test = "print x"; 

我想解析与Bison分析器我写。可能吗?

+0

最有可能的是。你试过什么了?什么不起作用? – Kninnug

+3

您需要配置您的词法分析器,以便它将从字符串中读取,标记它,并在达到最后时报告EOF(通过返回值0)。您可能需要一个初始化函数和'yylex()'代码来读取初始化集。 –

+0

我该怎么做? – tejgop

回答

1

Bison解析器根本不读取输入。他们通过反复调用yylex来获得一系列令牌。 (或者,用现代野牛,你可以创建一个“推式解析器”,它在连续的调用中被赋予标记)。因此,无论什么工具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解析字符串。

+0

获取此错误:'错误:使用未声明的标识符'yy_free_buffer'' – tejgop

+0

@TejGop:对不起,内存痉挛。它是'yy_delete_buffer'。修复了答案。请参阅[文档](http://flex.sourceforge.net/manual/Multiple-Input-Buffers.html#Multiple-Input-Buffers) – rici

+0

有没有这样做的方式(从字符串读取),而在中间从文件读取而不重新启动野牛的解析状态?我可以很容易地从字符串中读取flex,但是当它出现时,由于某种原因,bison会启动一个新的解析堆栈,而不是继续现有的堆栈。 – velocirabbit