摘要
本论文研究编译原理,使用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;
第1章 研究背景与国内外现状
LEX&YACC是20世纪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 词法分析
计算机存储的源代码,与我们直接写出的程序是不相同的。计算机中所有的数据均已0和1的形式存储在存储单元中,源代码也一样。
我们输入源程序,对构成源程序的字符串从左到右一个字符一个字符地进行扫描和分解,依据词法规则(或构词规则)识别出一个个的单词(单词符号或符号),转换成机器容易识别的内码形式。内码用二元式(种别码,属性值)表示。我们的 输入是字符串。我们的输出序对是(种别码,属性值)。 属性值是单词的机内表示是最初级的语法分析 单词种类我们可以分为两类。一类是特殊的单词,如保留字、运算符、分界符等,这些都是源语言所提供的;另一类是普通单词,如用户在源程序中定义的标识符、常数等。
图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本质是