我正在尝试理解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;
}