为什么我的lex输出.exe没有返回任何响应? (在hello world失败)

时间:2017-09-27 15:14:16

标签: c yacc lex

我正在努力理解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;

2 个答案:

答案 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;
}