S.l.e!ep.¢%

像打了激速一样,以四倍的速度运转,开心的工作
简单、开放、平等的公司文化;尊重个性、自由与个人价值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

yacc学习笔记(1) 2013.05.11

Posted on 2013-05-11 23:58 S.l.e!ep.¢% 阅读(3122) 评论(2)  编辑 收藏 引用 所属分类: yacc
没接触过语法解析, 今天在网上看到的一个simple demo,随手试了一下
一开始在 sourceforge 下载了 flex, 结果发现在里面没有找到 vc 的工程

结果另外找了 flex+gcc+tools 直接拿了 flex.exe 使用

simple.l 文件

%{
#include 
<stdio.h>
%}


%%
begin printf(
"started\n");
hello printf(
"hello yourself\n");
thanks printf(
"your welcome\n");
end printf(
"stopped\n");
%%

然后用VC建了个工程,编译之

结果出现这个错了
lex.yy.obj : error LNK2019: 无法解析的外部符号 _yywrap,该符号在函数 _yylex 中被引用
x:\Debug\test.exe : fatal error LNK1120: 1 个无法解析的外部命令

难道是需要加入lib?
结果在 simple.l 最前面加上
%option noyywrap   

表示不连接  yywrap 库, 再生成一次
结果是另一个错

error LNK2019: 无法解析的外部符号 _main,该符号在函数 ___tmainCRTStartup 中被引用

看了它生成的  lex.yy.c
#if YY_MAIN    <---- 它这里有个开关
int main()
 {
 yylex();
 return 0;
 }
#endif

于是在 %option noyywrap    的基础上猜想,应该有另一个 option 的开关让他生成  main() 函数吧, 度娘一搜果然找到了
%option main
结果还惊奇的发现
%option main 是默认打开  %option noyywrap    的

完整的 simple.l 如下
%option main 

%{
#include 
<stdio.h>
%}


%%
begin printf(
"started\n");
hello printf(
"hello yourself\n");
thanks printf(
"your welcome\n");
end printf(
"stopped\n");
%%


完美的编译通过

后记:
一开始,出现 error LNK2019: 无法解析的外部符号 _yywrap,该符号在函数 _yylex 中被引用 这个错误时,一直在找 flex 的 windows 版本的lib但一直没找着
后来在网上看了别人写的.l 文件有%option noyywrap ,并且没有链接 flex的lib, 果断试了下.

Feedback

# re: yacc学习笔记(1) 2013.05.11  回复  更多评论   

2013-05-23 20:07 by seahouse
学习一下

# re: yacc学习笔记(1) 2013.05.11  回复  更多评论   

2013-06-07 23:28 by coreBugZJ
《flex 与 bison(中文版)》

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理