C++ 如何将lex-yacc的API设置为Program
我创建了一个.exe文件,它可以解析由lex和yacc生成的表达式。但我只是从屏幕上获取输入,然后从屏幕上返回解析器结果。我看到了一些关于使用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_
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),那么它将是解析器。