`
NeuronR
  • 浏览: 59836 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

[语法分析]混合语法分析

阅读更多

    之前小小地透露过,我会用LR分析方法。它很强大,而且效率比较高,而且Jerry语言的语法(虽然还未具体证实,但我可以保证)是相对(于LALR(1)或LR(1)方法)容易构造的SLR(1)文法。

    然而无论如何,Jerry语言语法的复杂性显然是大大高于书上一般给出的练习,那些练习通常只有几个产生式,至多十来个LR项目。然而Jerry一共有三十多个产生式,写出LR项目一共有大约70个。所以用严格的LR分析方法来搞,复杂度是不可思议的(特别是当语法产生式有扩充的时候),LR项目族集。因此得简化LR分析法。

 

    从LR分析的本质上看,它就是一个分析3型文法的DFA再带个有规约功能的栈。使用栈的重要原因(也是唯一原因)就是因为语法会递归,这些信息需要用栈来存放。因此如果把语法分析中的产生式分成两类——会递归的和不会递归的——分开分析,那么一些LR分析会更清晰一些(在不完全画出LR项目族集时)。对于不递归的产生式,把它们认为是特殊的3型文法就可以了;而递归的产生式也不必那么纠结,仔细看看,除了在变量定义时可以定义一个或多个需要递归,就是各种运算。而运算这个东西嘛,不知道大家是否玩过表达式求值的小程序,其实可以把这个程序简化一下(可以将词法分析从中剔除掉)移植过来,在需要(Assignment)时就跳转到这个小程序中进行。

    之前说到nextToken这个重要的函数是语法分析和词法分析的桥梁,那么只要搭两座桥就可以了——写两个nextToken函数的实现。当然,这并不意味着词法分析在获得符号后去需要去选择一个函数,这样词法分析就变得太复杂了。一个易行的解决方案是,将nextToken声明为一个函数指针,默认指向LR分析函数,当LR分析函数读入到

    First(Assignment)

中的元素时,压进栈,然后改变指针指向表达式求值的变种版本。当表达式求值遇到任何错误时(相当有可能是正确结束时),再把指针改回来。万事大吉。

 

    然而,事情没这么简单,如果只是在两种不同的语法分析方法之间切换,那么遇到诸如

    x = a[13 + b[31]];

这样的输入,语法分析器就没辙了,因为在遇到 b[31] 之前,语法分析器指针就一直指向算符优先分析函数,读到这里时,怎么处理呢?一种方案是将算符优先分析再弄复杂一点(这确实是可行的),让它也能够识别所有的包括嵌套着的变量数组。我觉得这是很不适合的,因为混入算符优先分析的初衷就是为了简化单个的语法分析模块;其次,如果单独抽出识别变量数组的语法分析作为一个新的模块,它还可以在识别变量声明语句是被重用。

    这里我想到的另一种解决方法是,再开辟一个语法分析器栈,每到需要时,将最适合的语法分析函数(和它所需的数据结构)压入分析器栈的栈顶。在栈底的是LR分析器。如识别到

    int x[100][200 + 100 * // 未完成

的时候,分析器栈内是这种状况:

 

栈底

    LR分析函数

    变量识别函数

    算符优先分析函数

栈顶

 

当读入到

    int x[100][200 + 100 * 20] // 未完成

时,算符优先分析碰到无法识别的符号 ']' ,即认为识别结束,然后将识别到的代表

    200 + 100 * 20

的非终结符记录下来,然后弹出栈顶分析函数(算符优先分析函数),将该非终结符送入此时栈顶的变量识别函数。变量识别函数将该非终结符移进(姑且用这个词),然后继续识别(从接下来的 ']' 开始)。

 

    说去说来,语法分析里面遍布栈的踪影,因此我们急需一个栈结构。不过并不用费心自己来写一个,以下站点包含一个开源的C语言基本数据结构库(而且是C语言面向对象的):

http://code.google.com/p/cobjorntlib/source/browse/#svn/trunk

分享到:
评论

相关推荐

    LR语法分析 java版

    实现一个关于表达式的LR语法分析程序 识别用户输入的包含变量与整数的混合算术表达式(不包含减法与除法运算) 文法如下: 0 S E 1 E E+E 2 E E E 3 E E 4 E i 编程运用上述LR分析表 识别从键盘输入的算术...

    LR语法分析

    在本实验中,学生需要实现一个LR语法分析程序,其目的是识别包含变量与整数的混合算术表达式,但不包括减法和除法运算。实验的主要内容包括以下几个部分: 1. **文法定义**: - S -> E - E -> E + E - E -> E * ...

    实现LR分析法

    实现一个关于表达式的LR语法分析程序,识别用户输入的包含变量与整数的混合算术表达式(不包含减法与除法运算)。 二、实验主要内容 1、文法如下: 0) SE 1) EE+E 2) EE*E 3) E(E) 4) Ei 2、对应的LR分析表如下...

    Hspice 语法手册_hspice网表语法_hspice_

    它基于SPICE(Simulation Program with Integrated Circuit Emphasis)的基础,但增加了更多高级功能,如高速模拟、射频特性分析、混合信号仿真等,以满足现代复杂电路设计的需求。 **HSPICE网表语法** 在HSPICE中...

    C#和Javascript两种语法判断混合字符长度

    C#和Javascript两种语法判断混合字符长度,有利于Web程序开发避免存储字符串的错误

    智慧教室环境下英语专业英语语法课程混合式教学模式探索.pdf

    智慧教室环境下英语专业英语语法课程混合式教学模式探索

    龙书中LL1语法分析器(简易)

    《龙书中LL1语法分析器(简易)》是基于编译原理中的一种解析技术——LL1分析法,结合《龙书》(即《编译程序设计》)中的理论实现的一个简单解析器。LL1分析器主要用于理解编程语言的文法结构,将其转化为计算机...

    基于移动互联网技术的英语语法混合式教学模式探究

    基于移动互联网技术的英语语法混合式教学模式探究知识点: 一、混合式教学模式的概念及其重要性 混合式教学(Blending Learning)是将传统教学与数字化或网络化学习的优势相结合的教学模式。该模式由何克抗教授引入...

    基于微课和APP的英语语法混合式教学模式研究.pdf

    【基于微课和APP的英语语法混合式教学模式研究】 在当前“互联网+”的时代背景下,教育领域也正经历着深刻的变革。微课作为一种新型的教学资源,以其主题鲜明、内容精炼、便于使用的特性,打破了传统教学模式的局限...

    统计软件spss的语法

    IBM SPSS Statistics是统计分析软件,它提供了一套完整的命令语法结构,用户可以通过编写命令来实现统计分析。语法文件的编辑使用的是SPSS专有的语法文件,后缀名通常为“.sps”。在SPSS中,语法文件通过一系列的...

    LR分析法的实现

    实现一个关于表达式的LR语法分析程序,识别用户输入的包含变量与整数的混合算术表达式(不包含减法与除法运算)。 二、实验主要内容 1、文法如下: 0) SE 1) EE+E 2) EE*E 3) E(E) 4) Ei 2、对应的LR分析表如下...

    编译原理课程设计实现四则混合运算

    在编译原理课程设计中,实现四则混合运算是一项典型的任务,它涵盖了编译器设计的核心环节:词法分析、语法分析、语义分析以及代码生成。本项目以Java语言为基础,同时也涉及到汇编代码的实现,使得学习者能够深入...

    计算语法学中的传统语法方法.pptx

    传统语法方法是指在自然语言处理(NLP)领域中应用的一系列基于规则、统计以及混合方法的技术,用于分析和理解人类语言的结构。这些方法主要关注于词性标注、句法分析等方面,旨在通过计算机自动解析文本,提取有用...

    C语言语法 及51单片机语法

    2. **兼容性好**:C语言兼容其他语言,并能与汇编语言混合使用,便于硬件控制。 3. **程序结构清晰**:C语言支持结构化的程序设计方法,代码组织清晰。 4. **表达式简练**:提供了丰富的表达式和运算符,使得编写...

    语法制导翻译及中间代码生成1

    在编译过程中,词法分析和语法分析仅仅完成了对源代码结构的验证,确保其符合语言规范,但并未涉及代码的实际含义。为了将源程序转化为计算机可以直接执行的目标代码,编译器需要进行更深入的处理,这通常包括语法...

    论文研究-基于混合自动机的PSL模型研究.pdf

    通过分析PSL(property specification language)对系统属性的形式化描述方法,并分析混合自动机理论对混合信号系统抽象能力,提出了适合于混合信号电路系统快速验证的PSL模型。结合混合自动机对PSL进行了基于混合...

    编译原理课程设计_四则混合运算_C语言

    在这个过程中,词法分析和语法分析是至关重要的步骤。词法分析负责识别输入源代码中的词汇单元,如数字、标识符、运算符等;语法分析则检查这些词汇单元是否遵循语言的语法规则,形成抽象语法树(AST)。 SLR...

    程序设计语言编译原理(第三版)答案

    本资源提供了编译原理第三版的答案,涵盖了编译原理的基本概念、语法描述、词法分析、语法分析和编译技术等方面的知识点。 1. 语言的定义和分类: * 语言的定义:一个语言是一组字符串的集合,满足某些规则和约束...

    MediaWiki语法.pdf

    - 混合列表可以通过在同一个段落使用 `#` 和 `*` 创建,例如: ``` # 祖父 #* 父 #* 母 ## 兄 ##* 弟 ##* 妹 ``` 缩进可以通过以下方式实现: - 使用半角冒号(:)控制文本缩进,多个冒号(:)可以实现不同...

    项目源码 词法语法分析器设计 一款从零开始的数据库内核

    此外,toadb还支持行列混合式存储模型,相较于传统的行式存储更适合数据爆炸今天。通过使用toadb,你可以更深入地了解数据库的内部运作机制和原理,提高自己的技术水平。 toadb的发展是开源的,我们欢迎任何人对...

Global site tag (gtag.js) - Google Analytics