我正在努力理解lex / yacc,目前我在hello world失败了。我可能在某个地方搞砸了什么,但我似乎无法找到它。
另外,我对C语言或lex / flex / yacc / bison没有经验,所以这对我来说都是新的。
test.l文件;
%option noyywrap
%{
#include <stdio.h>
%}
%%
"hey" printf("hello!");
%%
int main()
{
return 0;
}
我使用命令在Windows上编译它;
lex test.l
这将返回lex.yy.c文件,没有错误或警告。 然后我用;
编译cc lex.yy.c
如果没有错误或警告,也会创建a.exe。 当我然后用另一个文件的输入运行文件时;
a.exe < input
它什么都不返回。
输入文件;
"hey"
欢迎提供任何信息,因为我发现的每一个指南都会产生错误(即使在完全复制粘贴后,即使在干净安装和引导安装之后),或者只是过时或列为“windows”,同时它使用非命令windows&gt;。&lt;
答案 0 :(得分:1)
这是 .l 文件中"hey"
的双引号,它们实际上并不代表"hey"
它们的意思hey
所以如果您更改输入文件只是说嘿而不是“嘿”你的代码应该工作。如果您要解析"
,那么您的规则应为:"\"hey\""
另外lex
应自动加入stdio.h
,因此您可能不需要它。
你好忘了叫yylex();
所以:
%option noyywrap
%%
"hey" printf("hello!");
%%
int main()
{
yylex();
return 0;
}
您会看到此行为发生,您可能不会立即注意到它,但
您的原始代码将为您提供输出。即使使用 \“hey \”输出,匹配也会,您将获得:
“你好!”
请注意"
。
这是因为lex为任何匹配的字符注入默认规则,只是将其吐出,并且因为"hey"
规则与hey
匹配且你有{{1}在"
答案 1 :(得分:0)
你的main
什么都不做 - 你需要打电话给词法分析器。
int main()
{
yylex();
return 0;
}