Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将lex-yacc的API设置为Program_C++_C_Yacc_Lex_Flex Lexer - Fatal编程技术网

C++ 如何将lex-yacc的API设置为Program

C++ 如何将lex-yacc的API设置为Program,c++,c,yacc,lex,flex-lexer,C++,C,Yacc,Lex,Flex Lexer,我创建了一个.exe文件,它可以解析由lex和yacc生成的表达式。但我只是从屏幕上获取输入,然后从屏幕上返回解析器结果。我看到了一些关于使用YY_BUFFER\u STATE YY_scan_BUFFER(char*base,YY_size\u t size)的建议,但我仍然找不到一个好方法 我可以把一些头(由Lax YACC编译)到我的主程序C++中,然后我可以使用YLYEXE()调用它,给出一个字符串作为输入,并在主程序中得到返回值吗?谢谢你的帮助,我对如何实现这一点感到困惑。谢谢 yy_

我创建了一个.exe文件,它可以解析由lex和yacc生成的表达式。但我只是从屏幕上获取输入,然后从屏幕上返回解析器结果。我看到了一些关于使用
YY_BUFFER\u STATE YY_scan_BUFFER(char*base,YY_size\u t size)
的建议,但我仍然找不到一个好方法


我可以把一些头(由Lax YACC编译)到我的主程序C++中,然后我可以使用YLYEXE()调用它,给出一个字符串作为输入,并在主程序中得到返回值吗?谢谢你的帮助,我对如何实现这一点感到困惑。谢谢

yy_scan_string
是将字符串作为输入的方式。首先调用它,然后调用
yylex
,它将使用该字符串作为输入,从而不是
stdin
获取令牌。当您从
yylex
获得EOF时,它已经扫描了整个字符串。然后,您可以在
yy_scan_string
返回的
yy_buffer_状态上调用
yy_delete_buffer
(以释放内存),如果要扫描新字符串,可以再次调用
yy_scan_string

您可以使用
yy_scan_buffer
来节省一点复制,但是您必须自己正确设置缓冲区(基本上,它需要以两个NUL字节而不是一个字节结束)


不幸的是,flex中没有标准头文件声明这些。因此,您需要自己在某个地方声明它们(从flex文档中复制声明),或者在
.l
文件的第三部分调用它们,该文件被逐字复制到
lex.y.c
文件的末尾。

我将其重新标记为gnu flex b/c它与w/Adobe flex无关。@www.Flextras.com:您是对的;“代码> GNU Flex exe < /代码>),那么您就不能将它作为C++程序中的子程序使用,所以我对您的问题的部分感到困惑。如果你问是否可以组织一个词法扫描器,这样它就不会从标准输入中读取,而是从字符串中读取,答案是“是的,但如何进行取决于你是使用AT&T Lex还是GNU Flex或其他Lex变体”。请澄清。另请参见。例如,我得到了lex.yy.c,frame.tab.c frame.tab.h(frame.l,frame.y已经生成),所以我想在我的主程序中使用它们。我希望将它们作为头包含,并且我可以使用一些函数来调用解析器。例如function1(&string1),那么它将是解析器。