lex&yacc
LEX:
yytext 数组包含匹配模式的文本;
使词法分析程序工作的两条规则是:
1. lex 模式只匹配输入字符或字符串一次。
2. lex 执行当前输入的最长可能匹配的动作。
由 lex 产生的词法分析程序是一个称为 yylex()的 C 例程,我们可以调用它.
main()和 yyerror(),这组函数是使用 lex 生成的词法分析程序进行编译时所必需的.
lex 词法分析程序从标准I/O 文件 yyin 中读取输入,所以当需要时,只需要改变 yyin。yyin 的默认值是stdin,
因为默认输入源是标准输入。当 yylex()到达输入文件的尾端时,它调用 yywrap(),该函数返回数值 0 或 1。如
果值为 1,那么程序完成而且没有输入。换句话说,如果值为 0,那么词法分析程序假设 yywrap()已经打开了它要读取
的另一个文件,而且继续读取 yyin。默认的 yywrap()总是返回 1。
% lex ch1-02.l
% cc lex.yy.c –o first –ll
词法分析程序与语法分析程序的通信
当一起使用 lex 扫描程序和 yacc 语法分析程序时,语法分析程序(parser)(yyparse)是较
高级别的例程。当它需要来自输入的标记时,就调用词法分析程序 yylex()。然
后,词法分析程序从头到尾扫描输入识别标记。它一找到对语法分析程序有意义
的标记就返回到语法分析程序,将返回标记的代码作为 yylex()的值。
最重要的子程序是 main(),这个子程序重复调用 yyparse()直到词法分析程
序的输入文件结束。例程 yyparse()是由 yacc 生成的语法分析程序.
lex ch1-n.l
yacc –d ch1-m.y
cc –c lex.yy.c y.tab.c
cc –o example-m.n lex.yy.o y.tab.o -ll
=================================================================
1. lex使具有起始状态的规则跟在一个没有起始状态的规则之后
.+ ECHO;
<MAGIC>.+ { BEGIN 0; printf("Magic:"); ECHO; }
可以将没有起始状态的规则隐式地认为具有一个“通配符”起始状态,它们匹配
所有的起始状态。这常常是错误的根源。flex 和 lex 的其他新版本都有“惟一的
起始状态”,可以解决通配符问题。参见第七章的“起始状态”一节可以得到更多的详细资料。
2.yacc 语法分析程序调用 yyerror()(它在用户的子程序段提供),然后识别特殊的规则 error。
3.yacc无论词法分析程序何时将标记返回给语法分析程序,如果标记有相关的值,词法
分析程序在返回之前都必须在 yylval 中存储值。
lex&yacc的更多相关文章
- Lex&Yacc Parser错误发生后再次parser之前恢复初始状态
使用lex yacc 对文件进行parser时,如果文件内容有错,parser报错,然后你修改了文件,再次读入文件进行parser,如果你不是重启程序进行parser,那就需要对做些处理了. &quo ...
- 【译】Python Lex Yacc手册
本文是PLY (Python Lex-Yacc)的中文翻译版.转载请注明出处.这里有更好的阅读体验. 如果你从事编译器或解析器的开发工作,你可能对lex和yacc不会陌生,PLY是David Beaz ...
- [转载] 如何使用Lex/YACC
原文: http://segmentfault.com/a/1190000000396608?hmsr=toutiao.io&utm_medium=toutiao.io&utm_sou ...
- Lex+YACC详解
1. 简介 只要你在Unix环境中写过程序,你必定会邂逅神秘的Lex&YACC,就如GNU/Linux用户所熟知的Flex&Bison,这里的Flex就是由Vern Paxon实现的一 ...
- LineCalc,一个基于Lex&Yacc的简单行计算工具
LineCalc是基于Lex&Yacc的一个简单的行计算工具,支持常见的运算符和部分POSIX中定义于math.h中的数学函数:同时,LineCalc还提供了一个简单的错误处理模块,能检测公式 ...
- Lex Yacc手册
Python Lex Yacc手册 本文是PLY (Python Lex-Yacc)的中文翻译版.转载请注明出处.这里有更好的阅读体验. 如果你从事编译器或解析器的开发工作,你可能对lex和yacc不 ...
- PERL/LEX/YACC技术实现文本解析--XML解析
继周六的p_enum.pl后,再来一篇说说我用perl做的lex,yacc工具.之前说了,我学习lex和yacc的最初动机是为了做个C语言解释器的SHELL:但后来工作中的实际需要也是制作perl版l ...
- qmake理解(还可以加入Lex Yacc文件)
关于qmake,好一段时间令我一头雾水,不知道用来干嘛的,只知道怎么用,而且也只懂那么一两个命令,详细看过资料以后整理如下: 1.首先,感性的认识是,qmake可以利用源文件(包括头文件h,实现文件c ...
- 编译原理之lex,yacc学习
写在前面的几句废话 最近在项目的过程中接触了lex 和 yacc,他们可以帮助我们来实现自己的领域语言.最典型的应用就是可以帮助我们来实现自定义测试脚本的执行器.但是,这里也有一个限制,就是测试脚本要 ...
随机推荐
- C# 强制关闭当前程序进程(完全Kill掉不留痕迹)
C# 强制关闭当前程序进程(完全Kill掉不留痕迹) /// <summary> /// 运行DOS命令 /// DOS关闭进程命令(ntsd -c q -p PID )PID为进程的ID ...
- 图的深度优先搜索算法DFS
1.问题描写叙述与理解 深度优先搜索(Depth First Search.DFS)所遵循的策略.如同其名称所云.是在图中尽可能"更深"地进行搜索. 在深度优先搜索中,对最新发现的 ...
- Ununtu 12.04 gedit安装插件Source Code Browser
1. 安装ctags: sudo apt-get install exuberant-ctags 2. 打开https://github.com/Quixotix/gedit-source-code- ...
- ios开发——实用技术篇Swift篇&地址薄、短信、邮件
//返回按钮事件 @IBAction func backButtonClick() { self.navigationController?.popViewControllerAnimated(tru ...
- Ubuntu开机时出现"没有正确安装GNOME电源管理器的默认配置
1:在登录界面.按Ctrl+Alt+F1,进入控制台命令行模式 2:先输入username,回车,然后输入password,登录成功 3:输入df -h,这个命令是查看硬盘空间的.能够看一下.你的ho ...
- mysql并发复制系列 一:binlog组提交
http://blog.itpub.net/28218939/viewspace-1975809/ 作者:沃趣科技MySQL数据库工程师 麻鹏飞 MySQL Binary log在MySQL 5. ...
- redis终于有比较大的进展了,redis3.0.1 稳定版本发布,支持集群。
原文地址:https://raw.githubusercontent.com/antirez/redis/3.0/00-RELEASENOTES Redis 3.0 release notes --[ ...
- Cent OS安装TL-WN725N 2.0 USB驱动
TP Link官方没有提供TL-WN725N 2.0的Linux驱动下载,折腾了我半天,试了各种方法.也有一部分原因是因为这机器还不能联网,导致有一些驱动因为缺少依赖并不成功安装. 后来终于在gith ...
- Helpers\Password
Helpers\Password The password class uses php 5 password_ functions. To create a hash of a password, ...
- 用 UIViewPropertyAnimator 编写动画
[iOS 10 day by day] Day 1:开发 iMessage 的第三方插件 [iOS 10 day by day] Day 2:线程竞态检测工具 Thread Sanitizer < ...