c语言 - 为什么我的 lex 输出.exe没有返回任何响应?(在你好世界失败)



我正在尝试理解lex/yacc,目前我在hello world上失败了。我可能在某个地方搞砸了一些东西,但我似乎找不到它。

另外,我对C语言或lex/flex/yacc/bison没有经验,所以这对我来说是全新的。

测试.l 文件;

%option noyywrap
%{
#include <stdio.h>
%}
%%
"hey"       printf("hello!");
%%
int main()
{
return 0;
}

我使用命令在窗口上编译它;

lex test.l

这将返回 lex.yy.c 文件,没有错误或警告。 然后我编译;

cc lex.yy.c

在没有错误或警告的情况下,也会像预期的那样创建 a.exe。 然后当我使用来自另一个文件的输入运行文件时;

a.exe < input

它不返回任何内容。

输入文件;

"hey"

欢迎任何信息,因为我发现的每个指南要么创建错误(当字面上复制粘贴时,即使在全新安装和引导安装之后),要么只是过时或列出"Windows",而它使用非 Windows>.<</p>

这是.l文件中"hey"中的双引号,它们实际上并不意味着"hey"它们的意思是hey所以如果你将输入文件更改为只是说而不是"嘿">,你的代码应该可以工作。如果要解析"则规则应为:""hey""

此外,lex应该自动包含stdio.h,因此您可能不需要它。

大声笑你忘了叫yylex();

所以:

%option noyywrap
%%
"hey"       printf("hello!");
%%
int main()
{
yylex();
return 0;
}

重要的微妙之处

您会看到此行为发生,并且您可能不会立即注意到它,但是

您的原始代码将为您提供并输出。即使有"嘿">输出,匹配也会发生,你会得到:

"你好!">

注意"的。

这是因为 lex 为任何字符匹配注入了默认规则以将其吐出,并且因为您的"hey"规则与hey匹配,并且您在输入周围有"引号出现在"hello!"

你的main什么都不做 - 你需要调用词法分析器。

int main()
{
yylex();
return 0;
}

最新更新