Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.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
Bison 使用多个输出文件的lex/yacc程序_Bison_Flex Lexer_Yacc_Lex - Fatal编程技术网

Bison 使用多个输出文件的lex/yacc程序

Bison 使用多个输出文件的lex/yacc程序,bison,flex-lexer,yacc,lex,Bison,Flex Lexer,Yacc,Lex,我正在使用lex和yacc,我需要创建两个输出文件。我需要做什么(如果有任何函数可以生成多个文件),以及如何命名每个文件 使用lex和yacc,我需要测试一个包含css的html文件,并从中生成两个文件,一个包含html,另一个包含css。基本上把css和html分开,放在不同的文件中 如果有人能提供一个如何生成两个输出文件的简单示例。您的问题有点宽泛,但正如收到的评论所表明的,也有点模棱两可。不过,我想我理解你的要求。首先,我将解决这个模棱两可的问题,然后开始解释如何实现你想要的 你似乎忽略了

我正在使用lex和yacc,我需要创建两个输出文件。我需要做什么(如果有任何函数可以生成多个文件),以及如何命名每个文件


使用lex和yacc,我需要测试一个包含css的html文件,并从中生成两个文件,一个包含html,另一个包含css。基本上把css和html分开,放在不同的文件中


如果有人能提供一个如何生成两个输出文件的简单示例。

您的问题有点宽泛,但正如收到的评论所表明的,也有点模棱两可。不过,我想我理解你的要求。首先,我将解决这个模棱两可的问题,然后开始解释如何实现你想要的

你似乎忽略了lex和yacc没有什么特别之处。它们只是在C(或C++)中创建程序的工具,这些程序是用编译器构建的,并以正常方式运行。这些程序的任何输出都是由该语言代码中的正常I/O语句生成的,而不是由lex或yacc生成的。Lex和yacc只是允许识别根据指定规则构造的输入的工具。flex和bison工具只是许多人使用的这些工具的模拟实现。在下面的解释中,我将使用flex和bison,但答案对lex和yacc同样有效

当您询问lex和yacc的两个输出文件时,可以解释为您询问的是它们生成的代码文件。lex工具根据输入规则生成一个名为lex.yy.c的文件。此文件包含构建词法分析器所需的代码。它还可以输出头文件。因此,我们可以从flex生成两个文件,如下所示:

flex --header-file=css.h --output-file=css.lex.c css.l
bison --defines=css-defines.h --output=css-tab.c --graph=css-graph.txt --xml=css-graph.xml css.y
但我们现在知道,这不是你要问的

bison/yacc工具还有几个用于生成多个输出文件的选项,如下所示:

flex --header-file=css.h --output-file=css.lex.c css.l
bison --defines=css-defines.h --output=css-tab.c --graph=css-graph.txt --xml=css-graph.xml css.y
但是,我们现在知道,这也不是你要问的

您想知道如何制作一个程序来创建两个文件,一个包含css,另一个包含来自单个输入文件的html。创建不同输出文件的语句只是用C编写的。参考C语言,我们可以发现两个创建不同名称的输出文件,我们可以使用
fprintf
语句:

FILE css, html;
open(css, "file.css", "w");
open(html, "file.html", "w");
fprintf(css, "%s\n", "a:link { color:blue }");
fprintf(html, "%s\n", "<a href=\"https://stackoverflow.com/questions/37127386/\">here</a>");
fclose(css);
fclose(html);
并生成以下内容:

<html>
 a:link { color:blue }
<a href=\"https://stackoverflow.com/questions/37127386/\">here</a>
</html>

a:链接{颜色:蓝色}
我们可以将CSS和HTML分开,因此:

.\css < SO.htm > SO-html.txt 2> SO-css.txt
\cssSO-html.txt 2>SO-css.txt
这可以进一步修改,使之成为一个工具,可以接受文件名作为参数,并为输出生成命名文件,这就是您所要求的


现在,您的问题可能会因为太宽泛而结束,但我希望我的小教程有用。

您的意思是需要创建两个不同的解析器吗?或者,在处理输入的过程中,您将生成各种输出文件?只有一个lex和一个yacc文件将生成两个输出文件。lex生成一个输出文件,yacc可以生成1、2或3,具体取决于您选择的选项:a.c、a.h,以及另一个名称我忘记包含所有状态信息的文件。如果希望生成的代码生成多个输出文件,则只需编写必要的代码。不清楚你在问什么。使用lex和yacc,我需要测试一个包含css的html文件,然后从中生成两个文件,一个包含html,另一个包含css。基本上把css和html分开,放在不同的文件中。
<html>
 a:link { color:blue }
<a href=\"https://stackoverflow.com/questions/37127386/\">here</a>
</html>
.\css < SO.htm > SO-html.txt 2> SO-css.txt