【发布时间】:2017-11-28 05:17:17
【问题描述】:
在 iTerm2 bash 中运行以下代码。代码文件是使用 Vim 创建的。
/* just like Unix wc */
%{
int chars = 0;
int words = 0;
int lines = 0;
%}
%%
[a-zA-Z]+ { words++; chars += strlen(yytext); }
\n { chars++; lines++; }
. { chars++; }
%%
main(int argc, char **argv)
{
yylex();
printf("%8d%8d%8d\n", lines, words, chars);
}
我运行了命令
$flex fb1-1.1
$cc lex.yy.c -lfl
这是它返回的错误
fb1-1.1:17:1: warning: type specifier missing, defaults to 'int'
[-Wimplicit-int]
main(int argc, char **argv)
^
1 warning generated.
ld: library not found for -lfl
clang: error: linker command failed with exit code 1 (use -v to see invocation)
编辑:现在工作。将 main() 更改为
int main(int argc, char* argv[])
还运行将 -lfl 更改为 -ll
$flex fb1-1.1
$cc lex.yy.c -ll
$./a.out
this is a text
^D
1 4 15
【问题讨论】:
-
main是一个函数。函数必须指定返回类型。说真的,为什么这么多问题都有这个完全相同的问题?谁在教这种古老的 C 方言? -
int main。但是你也缺少 flex 运行时库,所以你的程序没有链接! -
在 Mac OS 附带的 flex 发行版上,您必须使用
-ll而不是-lfl链接。但是通过将%option noyywrap放在 flex 文件的开头可以更容易地避免这个问题。那么你就不需要任何库了。 -
找到这个link
-
谢谢 rici。还将程序编辑为“int main(int argh, char **argv)”,但现在 bash 中没有输出? @AnttiHaapala
标签: c flex-lexer