LALR语法分析器
来源:互联网 发布:二维码解码器软件 编辑:程序博客网 时间:2024/06/02 03:10
LALR分析器是一种规范LR分析方法的简化形式。它可以对上下无关文法进行语法分析。LALR即“Look-AheadLR”。其中,Look-Ahead为“向前看”,L代表对输入进行从左到右的检查,R代表反向构造出最右推导序列。 LALR分析器可以根据一种程序设计语言的正式语法的产生式而对一段文本程序输入进行语法分析,从而在语法层面上判断输入程序是否合法。 实际应用中的LALR分析器并不是由人手工写成的,而是由类似于yacc和GNU Bison之类的LALR语法分析器生成工具构成。由机器自动生成的代码相比较于程序员手工的代码,拥有更好的运行效率而且减少了程序员的工作量.
lemon语法分析生成器
Lemon是一个C或者C++语言的LALR(1)语法分析器生成器。它和“bison”与“yacc”的功能是一样的,但它不是“bison”或者“yacc”的简单复制。为了减少编写代码的错误,它使用了一种不同的语法。Lemon使用了一种更为高级的分析引擎,运行速度比“bison”与“yacc”要更快,并且该引擎是可重入的和线程安全的。更进一步的,Lemon实现了能够消除资源泄漏的特性,适合于长时间运行的程序例如GUI或者嵌入式控制器中。
在UNIX领域,很多人对LEX和YACC可能比较熟悉。通过搭配使用这两个工具,可以构造出非常复杂的词法和语法分析程序。Lemon是一个类似于YACC的LALR(1)语法分析器,相对于YACC,它具有如下优势:
Lemon使用了一套不同于YACC的语法,这套语法更不容易产生编程错误;
Lemon生成的解析器是可重入和线程安全的;
Lemon引入了非终结符析构器的概念,使得写一个不会产生内存泄漏的解析器更容易。
众所周知的SQLite的语法分析就是用Lemon生成的。关于Lemon的详细信息,可见本文的参考资料部分。这里引入一个Lemon入门教程,供感兴趣的同学参考,本教程来自http://freshmeat.net/articles/view/1270。
下面是对lemon语法分析生成器的一个简介。
操作的原理
lemon的主要目标是把一个特定语言的上下文无关文法(CFG)翻译成C语言实现的该语言的语法分析器。程序有两个输入:
语法规范
分析器模板文件
典型的,程序员只需提供语法规范即可。Lemon自带了一个语法分析器模板,这对大多数的应用足够了。如果需要的话,用户可以替换一个新的分析器模板文件。
根据命令行参数,Lemon会产生下面文件中的一个到三个:
分析器的C语言代码;
一个头文件,为每个终结符定义了一个整型ID;
描述产生的语法分析器的状态的信息文件。
默认情况下,上面的三个文件都会产生。如果使用了“-m”选项,则不会产生头文件;如果使用“-q”选项,信息文件则不会产生。
语法规范文件是一个以“.y”为后缀的文件。在文档的例子中,设定规范文件的名称是“gram.y”。典型的使用方式是:
上面的命令会产生“gram.c”、“gram.h”、“gram.out”三个文件。第一个就是语法分析器,第二个就是为所有的终结符定义了数值的头文件,最后一个是分析器使用的状态自动机的说明。
完整的源代码包含在两个文件中,lemon.c本身就是产生器本身。一个单独的文件lempar.c是lemon产生语法分析子程序需要的模板文件。也可获取lemon的有关文档。
一个如何使用Lemon的例子,可以参见SQLite数据库引擎。lemon作为SQLite项目的一部分维护。
关于lemon的一个指南:http://souptonuts.sourceforge.net/readme_lemon_tutorial.html
。- LALR语法分析器
- 一个SLR,LR,LALR语法分析器
- 语法分析器
- 语法分析器
- 语法分析器
- 语法分析器
- 语法分析器
- java开发编译器之:LALR语法解析及代码生成
- java语法分析器介绍
- LR 语法分析器
- LR语法分析器程序设计
- lemon语法分析器生成器
- JavaCC语法分析器
- LL(1)语法分析器
- 编译原理--语法分析器
- 如何手写语法分析器
- LR语法分析器
- lex语法分析器
- Intellij 家族IDE 修改变量字段快捷方式
- C++四种强制类型转换运算符的联系与区别
- suse创建的虚拟机,修改ip地址
- Java spring +quartz实现定时任务
- 实验室云平台架构学习笔记
- LALR语法分析器
- 设计模式之:迭代器模式(Iterator)
- Android之Service与IntentService的比较
- ERROR! The server quit without updating PID file (/usr/local/var/mysql/ericliu.pid).
- 快速幂和快速矩阵
- 不同Servlet共享配置信息-ServletContext对象
- HDU-1003-Max Sum(dp经典问题-最大连续子序列和)
- 2-常量变量及逻辑运算符(if语句)
- Javascript变量和属性的区别