我是新手flex和bison,在我的Mac上,我使用这些在我的Mac上安装flex和bison:
brew install flex && brew link flex --force
brew install bison && brew link bison --force
这是我的test1ll.l
文件
%{
#include <iostream>
using namespace std;
%}
%%
[0-9]+ { cout << "Number "; }
[a-zA-Z]+ { cout << "Word "; }
[ \t] ;
%%
然后我运行以下命令:
flex -otest1ll.c test1ll.l
g++ test1ll.c -otest1 -lfl
./test1
我收到了这些错误:
dyld: lazy symbol binding failed: Symbol not found: _yylex
Referenced from: /usr/local/opt/flex/lib/libfl.2.dylib
Expected in: flat namespace
dyld: Symbol not found: _yylex
Referenced from: /usr/local/opt/flex/lib/libfl.2.dylib
Expected in: flat namespace
Abort trap: 6
有人可以解释并帮我解决吗?谢谢你提前。
答案 0 :(得分:1)
如果您打算使用C ++,您会发现更容易使您的flex扫描程序自包含,而不是依赖于假设C链接的libfl
。
在第一个%option noyywrap
之前添加%%
(但请参见下文),以避免需要yywrap
并在第二个{{后}添加简单的main
1}}:
%%
我个人更喜欢:
int main() {
while (yylex()) {}
return 0;
}
如果您不使用%option noinput nounput noyywrap nodefault
或-Wall
,前两个选项可以使用input()
进行编译,如果您的扫描仪无法识别,最后一个选项会导致flex抱怨一些输入。在这种情况下,它会标记一个事实,即扫描仪无法对非字母数字字符进行操作,只是将它们回显到标准输出。 (但也许这是故意的。)