基于语法分析的公式分析器设计

摘要

本论文研究编译原理,使用LEX&YACC工具,编写数学公式分析器。

编译原理是计算机专业的一门重要专业课,通过编写数学公式分析器,加深对专业知识的理解。

本论文编写的数学公式分析器,可以进行算数运算分析,变量运算,变量名可以是字母,也可以是单词。

 

 

 

关键词: 词法分析; 语法分析; 产生式;

 

 

 

 

Abstract

abstract

This paper studies the compiler principle, using LEX&YACC tools to write mathematical formula analyzer.

The compiler principle is an important professional course for computer majors. It helps to deepen the understanding of professional knowledge by writing mathematical formulas and analyzers.

The mathematical formula analyzer written in this paper can do arithmetic analysis, variable operations, variable names can be letters, or they can be words.

 

 

 

Key words:  LEXical analysis;  grammatical analysis;  production type;

 

 

 

 

 


摘要 I

Abstract I

1章  研究背景与国内外现状 1

2  设计思路 1

2.1  设计依据 1

2.1.1  编译过程 1

2.1.2  词法分析 1

2.1.3  语法分析 2

2.1.4  语义分析 2

2.1.5  代码优化 3

2.1.6  项目设计方案 3

3章  LEX&YACC简介与其语法结构 4

3.1  LEX简介 4

3.2   LEX格式 4

3.3  LEX识别规则 5

3.3.1  LEX用的正规式 5

3.4  YACC简介 6

3.5  YACC源程序说明部分的写法 7

3.4  实现词法分析的思路分析 9

3.4.1  无意义字符的识别 9

3.4.2  标识符、数字、字符和字符串的识别 9

4章 语法分析中的产生式 11

4.1 产生式简介 11

4.2 左递归的消除 11

4.3 算数运算产生式 11

    14

5章  基于语法分析的数学公式分析器的设计 15

5.1  实现简单算数运算 15

5.2  保存运算符与变量 15

5.3  支持多字符变量 15

5.4  编译运行程序 15

5.5  总结 16

参考文献 18

 


1章  研究背景与国内外现状

LEX&YACC20世纪70年代由贝尔实验室开发,已经成为标准的UNIX实用程序。

LEX&YACC既适合编译程序,解释程序的专业编译程序编写用户。也适合非编译程序编写许多应用程序。LEX&YACC使用范围包括,应用在输入中茶盅模式的应用程序,也可以应用在输入或命令语言的应用程序

LEX&YACC的源程序经过LEX处理后生成的词法分析程序与YACC处理后生成的语法分析程序,可以用C语言描述,可以使用C编译器编译,与其他目标文件或命令文件连接。

目前国内外应用LEX&YACC最多的方向是编写软PLC的编译器。使用LEX&YACC编写的程序与用户的手动编写的词法分析语法分析程序相比较,可以大大的降低编码量提升速度和提高质量。

第2章  设计思路

2.1  设计依据

2.1.1  编译过程

编译实现的是由源程序到可执行程序之间的转换。首先源程序经编译后以机器码的形式存储在代码区中,随着程序的逐条执行,不断进行着执行指令、压栈、出栈、清栈(管理栈空间)的操作,不断在代码区、静态数据区和动态数据区跳转,完成程序的执行。

2.1.2  词法分析

 

计算机存储的源代码,与我们直接写出的程序是不相同的。计算机中所有的数据均已01的形式存储在存储单元中,源代码也一样

我们输入源程序,对构成源程序的字符串从左到右一个字符一个字符地进行扫描和分解,依据词法规则(或构词规则)识别出一个个的单词(单词符号或符号),转换成机器容易识别的内码形式。内码用二元式(种别码,属性值)表示。我们的 输入是字符串。我们的输出序对是(种别码,属性值)。 属性值单词的机内表示是最初级的语法分析 单词种类我们可以分为两类。一类是特殊的单词,如保留字、运算符、分界符等,这些都是源语言所提供的;另一类是普通单词,如用户在源程序中定义的标识符、常数等。

 

图2-1:计算机中某段程序的16进制表示

 

例如:程序段

int x,a,b;

x=a+b*50;

词法分析后的结果为

保留字 “int” 、标识符 “x” 、界限符“,  ”、标识符 “a”、界限符 “,”、标识符 “b ”、界限符“;”  、标识符 “x ” 、运算符 “=”  、标识符 “a”、运算符 “+” 、标识符“b”  、运算符“* ”、整常数 “50 ” 、界限符“;”。 

通过编写的词法程序,历遍存储在内存中的十六进制源代码,将十六进制源代码全部转换为关键字、数字、字符串、分隔符等。不难发现词法分析只能够识别出一些可直接确定含义的字符。识别关键字后,并不能确定关键字的具体含义。

例如分析结果中,int”、“(”和“=”可以确定其分别表示整形、括号和相等或赋值。但是对于“m”,在目前词法分析的阶段,只能确定“m”是一个标识符,无法确定“m”是函数还是变量,要确定“m”的具体表示,只能将“m”放在其所在句型做分析,这就需要进行编译的第二步 — 语法分析。

2.1.3  语法分析

词法分析的作用是从连续的字符中扫描出标识符、关键字、数字运算符并存储为符号流。语法分析就是从符号流中识别出符合语法规定的语句。计算机不具有向人一样直接识别一条语句的功能。所以他只有逐个识别所有符号,识别出符合语言语法的语句。

语法的概念是语句中的规则,在计算机中这一规则表示为产生式。通过产生式产生的语法被语法分析器编写入其中输出为模板。

语法分析器的作用是将词法分析器识别出的符号与模板匹配,匹配出语法后按语法识别整句,明确语句语法。

2.1.4  语义分析

语义就是程序的“意思”,语义分析要分析语法成分的含义和用途,根据语义规则进行的运算和操作,同时进行相应的语义检查。 根据语义规则产生一种介于源语言与目标代码之间的一种中间代码。中间代码是不依赖于机器但是又便于生成依赖于机器的目标代码的一种结构简单、含义明确的记号系统。中间代码常用四元式来表示(算符,左操作数,右操作数,结果),中间代码简单规范、机器无关、易于优化与转换

2.1.5  代码优化

对前阶段产生的中间代码进行加工变换,以期在最后阶段能产生更为高效(省时间和空间)的目标代码。主要依据是等价变换规则,优化主要包括:删除公共子表达式、合并已知量、删除无用赋值、循环优化、算符规约等等。

2.1.6  项目设计方案

要实现数学公式分析器,需要完成两部分程序设计。首先是词法分析器程序设计,根据词法分析原理,需要从输入符号流中提取标识符号、10进制数、“+”“-”“*”“/”“(”“)”“,”“;”“\n”“=”。然后使用语法分析识别出算数运算,数学函数,变量运算,用户自定义公式。最终输出正确结果。

  
第3章  LEX&YACC简介与其语法结构

3.1  LEX简介

LEX本质是

MICROSOFT 基础类库 : ExpressionProcess 项目概况 应用程序向导已为您创建了此 ExpressionProcess DLL。此 DLL 不仅 说明了使用 Microsoft 基础类的基础,而且 也是编写 DLL 的起点。 此文件包含组成 ExpressionProcess DLL 的每个文件的内容摘要。 ExpressionProcess.vcproj 这是用应用程序向导生成的 VC++ 项目的主项目文件。 它包含有关生成此文件的 Visual C++ 版本的信息,以及 有关使用应用程序向导选择的 平台、配置和项目功能的信息。 ExpressionProcess.cpp 这是包含 DllMain() 定义的主 DLL 源文件。 ExpressionProcess.rc 这是程序使用的所有 Microsoft Windows 资源的列表。 它包含存储在 RES 子目录下的图标、位图和光标。 此文件可在 Microsoft Visual C++ 中直接编辑。 resExpressionProcess.rc2 此文件包含不由 Microsoft Visual C++ 编辑的资源。您应将不能由 资源编辑器编辑的所有资源放置在此文件中。 ExpressionProcess.def 此文件包含有关运行 Microsoft Windows 所需的 DLL 的信息。 它定义此 DLL 的名称和说明等参数。 它还从此 DLL 导出函数。 其他标准文件: StdAfx.h、StdAfx.cpp 这些文件用于生成名为 ExpressionProcess.pch 的预编译头 (PCH) 文件以及名为 StdAfx.obj 的预编译类型文件。 Resource.h 这是标准的头文件,它定义了新的资源 ID。 Microsoft Visual C++ 读取和更新此文件。 其他注释: 应用程序向导使用 "TODO:" 指示 应增加或自定义的源代码部分。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值