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,他们可以帮助我们来实现自己的领域语言.最典型的应用就是可以帮助我们来实现自定义测试脚本的执行器.但是,这里也有一个限制,就是测试脚本要 ...
随机推荐
- ResultSet转成java类对象
在做web开发时遇到一个事情: 需要从mysql数据表中查询数据并遍历查询结果 这样最简单的方式是:查询到结果根据表中字段列表的顺序来一个个获取字段,但这样需要记住字段的顺序,操作起来不是那么方便.因 ...
- alternatives命令使用方法
alternatives命令使用方法 alternatives是Linux下的一个功能强大的命令.仅仅能在root权限下运行.如系统中有几个命令功能十分相似,却又不能任意删除,那么能够用 altern ...
- Treeview1列表拒绝添加重复信息
function ItemExist(Text:string;TreeView:TTreeView):Boolean; var i: Integer; begin Result:=False; ...
- CSS里的单位
CSS中预设了16种颜色以及16种颜色的衍生色,这16种颜色是CSS规范推荐的.并且一些主流的浏览器都可以识别.例如以下表所看到的: 十六进制颜色是最经常使用的定义方式.它的基本格式为#RRGGBB, ...
- Cts框架解析(12)-ITargetPreparer
測试开启前的设备系统准备工作. 接口 /* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Ap ...
- Asp.Net MVC 3【URLs, Routing,and Areas】续
http://www.cnblogs.com/HuiTai/archive/2012/07/24/2597875.html 接着前面继续学习分享我们的路由. 现在我们把Global.asax文件里的R ...
- iOS 2D绘图详解(Quartz 2D)之Transform(CTM,Translate,Rotate,Scale)
前言:Quartz默认采用设备无关的user space来进行绘图,当context(画板)建立之后,默认的坐标系原点以及方向也就确认了,可以通过CTM(current transformation ...
- Linux下的简单好用的计算器bc
1. 关于bc bc是随意精度计算器语言,通常在linux下当计算器用,简单好用.相当于windows下的计算器. 2. 支持的运算符 主要的数学运算: + 加法 - 减法 * 乘法 / 除法 ^ 指 ...
- _vsnprintf 用法
_vsnprintf,C语言库函数之一,属于可变参数.用于向字符串中打印数据.数据格式用户自定义. 头文件: #include <stdarg.h> 函数声明: int _vsnprint ...
- 交换a、b
有两个变量a和b,不使用任何中间变量交换a和b. 方法一: 采用如下方法: a=a+b; b=a-b; a=a-b; 这样做的缺点就是如果a.b都是比较大的数,则a=a+b时就会越界. 而采用: a= ...