Lex(flex):如何提供输入和输出?

时间:2012-05-08 06:00:02

标签: compiler-construction yacc lex flex-lexer

我对Flex非常陌生,而且我很早就陷入困境。我有一个Lex文件20.l,其内容是

%{
/* a Lex program that adds line numbers
   to lines of text, printing the new text
   to the standard output
*/
#include <stdio.h>
int lineno = 1;
%}
line .*\n
%%
{line} { printf("%5d %s", lineno++, yytext); }
%%
main()
{ yylex(); return 0; }

我从我的教科书中复制了代码(它没有告诉我如何在这里处理我的问题)。我做完了

flex 20.l

并获得文件lex.yy.c.然后我用

编译它
gcc lex.yy.c -o ADD -lfl

并获得了可执行文件ADD。

现在我如何使用此ADD将行号添加到其他文本文件?例如,如果输入文件名是“try.c”,我应该使用哪些命令?我试过“./ADD try.c”,但显然没有用。输出如何表示?

谢谢。我知道这确实是一个愚蠢的问题,但似乎没有人在网上教这个怎么做......

2 个答案:

答案 0 :(得分:1)

  

我试过“./ADD try.c”

./ADD < try.c

输出显示在stdout上。如果你想要不同的文件处理,你可以编写自己的main()。

答案 1 :(得分:1)

启用./ADD try.c即不使用重定向 您可以使用用户代码部分中的以下代码替换main:

void main (int argc, char **argv)
{
    if (argc>0)
        yyin =fopen(argv[0], "r");
    else
        yyin = stdin;

    yylex();
}

您可以使用input-argument选项进行增强解析,以获得更好的输入和输出控制。