1.   控制参数
1.1.命令行参数
d 输出单独的定义文件
h 打印帮助信息
l 在生成的代码中生成#line
t 在生成的代码中将YYDEBUG使能
v 将分析过程中的详细信息输出到output文件中
y 将输出文件设置为y.c
V 输出本语法分析器的版本号
-o file_name 指定输出文件名
-p name 指定生成代码中各名字的前缀
1.2.语法文件中的选项
%define输出单独的定义文件
%no-line %no_line % no line不在生成的代码中生成#line
%debug在生成的代码中将YYDEBUG使能
%verbose将分析过程中的详细信息输出到output文件中
%output file_name 指定输出文件名
%name-prefix %name_prefix %name prefix指定生成代码中各名字的前缀
%skeleton file_name 指定框架文件
2.   词法分析的算法问题
2.1.识别字符串
/"[^"/n]* {
if (0 == yy_hold_char || '/n' == yy_hold_char) {
warn_at("unterminate string");
input();
yylval.chars = add_string(yytext + 1);
return string_content;
} else if ('//' == yytext[yyleng-1]) {
yymore();
} else {
input();
yylval.chars = add_string(yytext + 1);
return string_content;
} }
将字符串分成多个段,每次识别一段,并调用yymore继续识别剩余部分。遇到转义的双引号时将字符串分成两段,前面一段包含转义符,后面一段包含双引号,后面一段本身就是一个完整的字符串。此规则不能识别分成多行的字符串,如果要识别多行的字符串,必须解决超长字符串的问题。
2.2.识别注释
支持C语义中两种注释。
双斜杠开始的注释比较好识别,使用模式”//”.*即可。
对于斜杠加星的字符串,应该用独立的模式。扫描YACC规则时可能进入注释模式,扫描C代码时也可能进入注释模式,进入注释模式钱,应该记住当前的模式,以便返回正确的模式。
“/*” context_state = YY_START; BEGIN SC_COMMENT;
<SC_COMMENT> “*/” BEGIN context_state 退出注释状态
<SC_COMMENT> .|/n 跳过一切字符,遇到换行时将行号加一
<SC_COMMENT> <<EOF>> 打印告警并退出注释状态
2.3.识别YACC的三个部分
YACC源程序分三个部分,中间用顶行写的%%分割,后面可以跟其它任何字符,但这些字符都将被忽略。这三个部分文法规则差异很大,应该使用不同的扫描方式。在INITIAL中扫描第一部分,在SEC2中扫描第二部分,在SEC3中扫描第三部分。
%s SEC2 SEC3
<INITIAL> ^"%%"{OPTWS}$ BEGIN SECT2; return SECT_DIVISION;
<SEC2> ^"%%"{OPTWS}$            BEGIN SECT3; return SECT_DIVISION;
<SEC3> 定义第三部分的扫描规则。
在最外面定义三个部分都用到的扫描规则。
2.4.统计行列号
为了更好地输出分析过程中遇到的错误,应该把出错地方的行列号打印出来。
3.   语法分析的算法问题
3.1.语法冲突
向GOTO表中写数据时,如果表项非空表示出现冲突。
可以给终结符、规则定义优先级,从而自动解决冲突。可以通过%left、%right指定终结符的优先级,和结合方式。给终结符指定优先级后,包含该终结符的规则也有了相同的优先级。也可以用%nonassoc、%prec单独给规则指定优先级,nonassoc的含义是没有结合方式。
仲裁规约-规约冲突,如果两规则有相同的优先级则无法解决,否则取优先级高的规则。仲裁移进-规约冲突,如果优先级不同则取高的,否则根据终结符的结合方式决定动作,左结合时规约,右结合时移进。
扫描第一部分时记住终结符的优先级和结合方式,记住预定义的优先级,扫描第二部分时记住给规则指定的优先级,扫描结束后计算每个规则的优先级。如果规则右部包含多个指定了优先级的终结符,则取最后一个终结符的优先级。
该功能提供的接口:设置终结符的优先级和结合方式(终结符列表);设置预定义的优先级(字符串);设置规则的优先级(规则编号,字符串);计算所有规则的优先级(规则总数,规则表);仲裁规约-规约冲突(规则A,规则B);仲裁移进-规约冲突(终结符,规则)。
3.2.错误恢复机制
YACC有一个保留的终结符error,编写文法规则时,可以像使用其它终结符一样使用error。分析过程中将遇到的错误当成终结符error,从分析栈顶开始找一个能接受error的状态(丢弃不能接受error的状态),从这个状态开始继续分析,移进error。
能接受error的状态必然属于包含error文法规则,以文法E -> a B c | a error c为例来描述这个过程。该文法的LR(0)转移图如下,如果分析B的过程中遇到错误将退回到state 2,移进error转state 4。如果下一个符号不是c则再次回退到state 2,移进error转state 4,重复此过程直到遇到符号c,移进c转state 6,最后用规则E -> a error c规约。
(图片1)
如果 error 出现在文法规则的最后,分析过程会是怎样的呢?将上面文法改成 G -> E c; E -> a B | a error 。如果分析 B 的过程遇到错误将退回 state 4 ,移进 error 转 state 6 ,用规则 E -> a error 规约并移到 state 2 ,至此不能处理更多的错误。
(图片2)
1.1.act和goto表的存储
act为动作表,act[当前状态][向前看符号] = 移进并转状态s,或使用规则r规约,或出错。goto为转移表,goto[当前状态][非终结符] = 转状态s,或出错。做为下标的非终结符就是上次规约的结果。
将act[当前状态]中出现最多的项单独拿出来,保存在缺省动作表中,将goto[当前状态]中出现最多的项单独拿出来,保存在缺省转移表中,act和goto表中不用保存这些项,从而变成稀疏矩阵。经过这样处理,我们得到动作表、缺省动作表、转移表、缺省转移表。
压缩稀疏矩阵的算法很多,这个问题中不需要修改稀疏矩阵中的数据,有时间、空间性能都很好的压缩算法。以下面矩阵为例介绍此方法,先移动每行的位置,使下一行的数据可以使用上面的空白;第二步将多行数据压缩到一个线形表中,在每个数据项下面填写该数据所属的行号;第三步建立行索引,记住每行数据在线形表中的起始位置。
(图片3)

使用上面压缩算法时,即使两行的数据完全相同,也要存储两份。修改一下算法,在校验表中将行号改成列号,上面例子中校验表的数据变成(1,1,1,4,3,5,0)。
在流行的YACC程序中,goto表是按列存储的(既非终结符)。
1.   输出结果的问题
1.1.使用框架文件
YACC生成的语法分析程序中,只有act、goto等数据表和规约时的动作不同,其余都是相同的。
bison的框架文件是bison.simple,文件中以$符号开头的行表示需要插入动态生成的代码,例如“$ /* the action file gets copied in in place of this dollarsign */”。
flex也使用类似的技术,它的框架文件包含在exe文件里面。文件中以%%开头的行表示需要插入动态代码,而且用%-、%+、%*区分c代码和c++代码。例如:
%% 需要插入动态代码
%- 下面代码仅在生成c文件时输出
%+ 下面代码仅在生成c++文件时输出
%* 结束%-和%+的控制效果
2.   语法文件结构
2.1.整体结构
input:
declarations "%%" grammar "%%" epilogue
整个文件分三个部分:声明、语法、结尾。
declarations:  
/* Nothing */
| declarations declaration
声明由零个或多个声明项组成。

自己写语法分析生成器相关推荐

  1. LALR(1)语法分析生成器--xbytes

    0.概述: 看了编译器龙书和虎书后,自己手动写了一个LALR(1)语法分析生成器,使用的语法文件格式和lemon的差不多. 程序里面很多的算法也都是摘录自虎书,龙书虽然讲的很详细,但是真正动手写的时候 ...

  2. java语法分析生成器,语法词法生成器

    一.语法词法生成器 Flex 语法扫描器生成器 flex (fast lexical analyser generator) 是Lex的另一个替代品.它经常和自由软件Bison语法分析器生成器 一起使 ...

  3. JavaCC首页、文档和下载 - 语法分析生成器 - 开源中国社区

    JavaCC首页.文档和下载 - 语法分析生成器 - 开源中国社区

  4. lemon语法分析生成器的使用以及源代码分析

    特点以及优点 1.Lemon是一个C或者C++语言的LALR(1)语法分析器生成器. 2.它和"bison"与"yacc"的功能是一样的,但它不是"b ...

  5. 自动写文章生成器,为你一键生成原创文章!

    有多少朋友还在为写文章而苦恼,文章写不出来,文章写的慢,遇到这些写作问题,其实找个自动写文章生成器就能解决的事,方法也是非常简单,无论什么类型的文章写作,有了自动写文章生成器就不用担心文章写不出来的问 ...

  6. AI自动写文章生成器系统源码 一键生成高质量原创文案

    分享一个AI自动写文章生成器系统源码,程序包含电脑端+手机端+详细的搭建教程,源码开源可二开. 功能介绍: 是一款人工智能对话系统,它可以聊天,写文章,写论文,写代码,写小说,创意策划,做Excel表 ...

  7. 语法分析生成器 - LEX

    [转载]The Lex & Yacc Page Lex - A Lexical Analyzer Generator M. E. Lesk and E. Schmidt ABSTRACT Le ...

  8. AI自动写文章_免费在线原创文章生成器

    自动写文章生成器 自动写文章生成器是一种利用人工智能和自然语言处理技术,帮助用户快速生成文章的工具.该软件可以根据用户的需求和选择,自动生成符合要求的文章,无需手动编写和修改. 自动写文章生成器的主要 ...

  9. 【Bison学习笔记】1:生成简易的语法分析程序,使Bsion和Flex协同工作

    简述 Bison是在Yacc上改写并添加了大量特性后诞生的语法分析生成器,在编译前端(词法分析->语法分析->语义分析)中处在中间的位置,它可以用来生成特定的语法分析程序. 安装Bison ...

最新文章

  1. asp.net基础复习(二)——母版页
  2. mysql 连接数的最大数
  3. Educational Codeforces Round 80 (Rated for Div. 2) C. Two Arrays 组合数|dp
  4. LPC1758串口ISP下载程序
  5. mti杂波抑制仿真 matlab,MTI+MTD+CFAR简单仿真
  6. linux大容量硬盘 克隆到小硬盘_clonezilla 不管用了,手动把 GPT 分区的 ubuntu14.04 从大硬盘克隆到小硬盘...
  7. 梳理STM32F429之通信传输部分---NO.8 硬件SPI
  8. Poi的Excel的导入导出 支持2007
  9. 上车了!AR摩托车头盔了解一下?
  10. 【压缩感知合集5】压缩感知简介和数学模型分析
  11. 分支定界法需要注意的是什么
  12. 蓝桥杯-第九届决赛——采油
  13. 一些好的网页设计工具
  14. 国内网络安全公司、社区简介
  15. 山外山在科创板上市:市值约47亿元,高光勇为实际控制人
  16. 【DVB】DVB基本问题
  17. 微软服务器搭建ngrok,ngrok搭建(Windows服务端+Windows客户端)
  18. QA:IMEI号申请、什么是IMEI号、怎么申请IMEI、IMEI作用
  19. 关于飞思卡尔S12系列单片机SPI通信MODRR配置
  20. win7如何打开微软更新服务器地址,win7系统更新设置在哪里?小编告诉你

热门文章

  1. 一文学懂ansible
  2. Revit转点云pcd模型
  3. 向量几何在游戏编程中的使用3
  4. 用JAVA获取文件的MD5哈希码
  5. x21Android版本多少,vivo X21
  6. Windows系统VisualSVN-Server下载安装和配置
  7. 解决浏览器无法输出中文的问题
  8. Android 监听手机来电和去电
  9. SQL截取字符串中的某个特定位置部分
  10. Java中匿名子类 的 匿名对象、匿名子类 的 非匿名对象、非匿名类 的 匿名对象、非匿名类 的 非匿名对象