lex 不生成输出

问题描述 投票:0回答:1

只需按照 https://begriffs.com/posts/2021-11-28-practical-parsing.html 上的教程进行操作即可。我的 .l 文件如下所示:

/* catcot.l */

%{
#include <stdio.h>
%}

%%

cot { printf("portable bed"); }
cat { printf("thankless pet"); }
cats { printf("anti-herd"); }

我发出命令:

lex catcot.l

生成的输出为空:

$ ls -l
total 16
-rw-r--r--  1 falk  staff  141 Dec 27 14:19 catcot.l
-rw-r--r--  1 falk  staff    0 Dec 27 14:19 lex.yy.c

使用 -v 运行表明 lex 确实在运行 (

flex version 2.5.35 Apple(flex-32)
),并且在代码中引入错误会给出预期的错误消息,但不会生成任何输出。

macos lex
1个回答
0
投票

您忘记了

int main()
功能。您需要在主入口函数中提供
yylex()
,以便可执行文件处于类似 REPL 的状态并能够通过输入运行代码。

通常在 C 中,代码首先运行

main()
入口函数,然后继续运行,直到到达
yylex()
函数。然后,它会进入类似 REPL 的状态,您可以根据您刚刚在 lex 代码中写下的内容来输入您想要的内容。

例如,当您输入

cat
时,它将在命令行中输出
thankless pet
(并且
cot
在命令行中打印
out portable bed
)。

这里有一些提示:

  1. 通过告诉用户在运行之前要做什么来确保您的代码进入类似 REPL 的状态

    yylex()
    (例如
    Enter a cot, cat or cats here:

  2. 你必须添加一些允许人们退出的东西。如果不使用

    CTRL+C
    ,我建议添加一个字符或文本来退出类似 REPL 的状态。 (例如 > 或 exit)(您可以在启动时指定,以便为不知道 lex 的用户提供退出 REPL-Like 状态的方法)

  3. 如果您想使用文件而不是类似 REPL 的界面,请使用

    cat
    命令,并将输出通过管道 (
    |
    ) 传输到
    lex
    /
    flex
    生成的程序。

希望有帮助

  • 楼克
© www.soinside.com 2019 - 2024. All rights reserved.