只需按照 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)
),并且在代码中引入错误会给出预期的错误消息,但不会生成任何输出。
您忘记了
int main()
功能。您需要在主入口函数中提供 yylex()
,以便可执行文件处于类似 REPL 的状态并能够通过输入运行代码。
通常在 C 中,代码首先运行
main()
入口函数,然后继续运行,直到到达 yylex()
函数。然后,它会进入类似 REPL 的状态,您可以根据您刚刚在 lex 代码中写下的内容来输入您想要的内容。
例如,当您输入
cat
时,它将在命令行中输出 thankless pet
(并且 cot
在命令行中打印 out portable bed
)。
这里有一些提示:
通过告诉用户在运行之前要做什么来确保您的代码进入类似 REPL 的状态
yylex()
(例如 Enter a cot, cat or cats here:
)
你必须添加一些允许人们退出的东西。如果不使用
CTRL+C
,我建议添加一个字符或文本来退出类似 REPL 的状态。 (例如 > 或 exit)(您可以在启动时指定,以便为不知道 lex 的用户提供退出 REPL-Like 状态的方法)
如果您想使用文件而不是类似 REPL 的界面,请使用
cat
命令,并将输出通过管道 (|
) 传输到 lex
/flex
生成的程序。
希望有帮助