如何使 YY_INPUT 指向字符串而不是 Lex & 中的 stdin Yacc(Solaris)
我希望我的 yylex() 解析字符串而不是文件或标准输入。如何使用 Solaris 提供的 Lex 和 Yacc 来完成此操作?
I want my yylex()
to parse a string rather than a file or standard input. How can I do it with the Lex and Yacc provided with Solaris?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
重新定义YY_INPUT。这是一个工作示例,使用命令“
Input is read from globalInputText”进行编译和运行。您可以修改此示例,以便全局输入文本是您想要的任何字符串或来自您想要的任何输入源。
parser.y:
lexer.l:
myparser.c:
Redefine YY_INPUT. Here's a working example, compile and run with the commands
Input is read from globalInputText. You can modify this example so that global input text is whatever string you want or from any input source you want.
parser.y:
lexer.l:
myparser.c:
如果您使用真正的
lex
而不是flex
我相信您可以简单地定义自己的这可以从字符串或您想要的任何内容返回字符。
或者,我相信您可以将字符串写入文件,然后在流
yyin
上打开该文件。我怀疑这对于任何一种实现都适用。如果使用 flex 那么我认为你重新定义了
YY_INPUT()
宏,If you are using the real
lex
and notflex
I believe you can simply define your ownThis can return characters from a string or whatever you want.
Alternatively, I believe you could write the string to a file, and open the file on stream
yyin
. I suspect this would work with either implementation.If using flex then I think you redefine the
YY_INPUT()
macro,另一种方法是使用 yy_scan_string 正如链接答案中已经提到的
another approach is to use yy_scan_string as already mentioned in linked answers
尽管使用 popen 有风险,但以下内容应该适用于任何实现。
Here is something that should work with any implementation, although risky by using popen.
正如之前所说,可以通过重新定义
input()
来完成 - 我已经在 aix、hpux 和Solaris 上使用过它。或者我也使用的另一种方法是创建一个管道,并使用
fdopen()
-edFILE*
作为yyin
。As was said before it can be done through redefining the
input()
- i've used it on aix, hpux and solaris.Or another approach i use too is to make a pipe, and use
fdopen()
-edFILE*
asyyin
.