2017-04-10 97 views
1

我新的弯曲和野牛,在我的Mac,我使用这些安装flex和野牛在我的Mac:使dyld:延迟符号绑定失败:找不到符号:_yylex

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 

有人可以解释,并帮助我解决这个问题?先谢谢了。

回答

1

如果您打算使用C++,您会发现使您的柔性扫描仪自成一体更容易,而不是依赖libfl(它假设C链接)。

第一%%之前添加%option noyywrap(见下文),以避免yywrap的需要,并在末尾添加一个简单main,第二%%后:

int main() { 
    while (yylex()) {} 
    return 0; 
} 

个人而言,我更喜欢:

%option noinput nounput noyywrap nodefault 

如果您不使用前两个选项,可以使用-Wall进行编译input()unput(),如果您的扫描仪无法识别某些输入,最后一个会导致flex投诉。在这种情况下,它会标记出这样的事实,即您的扫描仪无法对非字母数字字符进行操作,只是将它们回显到标准输出。 (但也许这是故意的。)

相关问题