词法分析器的设计与实现
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
总第 168 期
内蒙古科技与经济
自动机是从识别的角度来看待单词 。通过人为 的在自动机 (本质上是一个有向图) 上找一条从起点 到终点的路径就可以确定某个单词是否为合法的单 词 。自动机的另一个特点是可以非常方便的转化为 程序 。我们可以将每类单词连接成为只有一个入口 一个出口的自动机 。连接后的自动机如下图 4 。
词法分析是编译程序进行翻译的第一个阶段 , 他对程序进行线性分析 ,从字符串中分出单词 ,并检 查所分出的单词是否为合法的词类 。编译中的分词 思想在“文本格式化”及“公式排版”中应用的比较广 泛 ,是一种实用性很强的分析方法 。
词法分析顾名思义就是分词 。它以程序设计语 言编制的源程序作为输入 ,以单词序列作为输出 。 分词过程可以通过编制程序自动完成 ,我们通常称 这个分词程序为词法分析器 。词法分析器分析的源 程序可以是现有的各类程序设计语言源程序也可以 是人为给定的模型语言的源程序 。本文中的源程序 为后者 。 1 词法分析器的设计
ret urn token ;
}
else
{ switch (Char)
{ case’;’:token. type = SEM ICO ;break ; case’,’:token. type = COMMA ;break ; case’+ ’:token. type = PL U S ;break ;
第 14 期 总第 168 期 2008 年 7 月
内蒙古科技与经济 Inner Mongolia Science Technology & Economy
No. 14 , t he 168t h issue J ul. 2008
词法分析器的设计与实现Ξ
张 岚 ,王 鑫
(内蒙古财经学院 计算机信息管理学院 ,内蒙古 呼和浩特 010051)
词法分析器设计时 ,输入的源程序以文件的形 式存储在外部 。主控程序通过打开文件调用待分析 的源程序 。
我给定的模型语言如图 4 。从词的角度来看 , 它涉及的内容较为简单 ,只包括几个较为常用的词 类 ,词类的构成上也适当的作了一些简化 。对词进 行分析时 ,我们是按类型进行分析的 。不同类型的 词在后续的分析中所起的作用不同 ,相应的操作也 各有不同 ,但同种类型中的词虽然单词的构成不同 但从宏观上看它们的操作大体一致 。模型语言中的 单词可以分为“关 键 字 ”、 “标 识 符 ”、 “常 数 ”、 “分 隔 符”“ 、运算符”几类 。一般 ,关键字在程序设计语言 中人为给定 。程序设计时采用一字一码的形式处 理 。标志符为一类 ,不同的标志符通过值区别 。常
摘 要 :介绍了词法分析器的概念 ,并指出词法分析器设计时 ,输入的源程序以文件的形式存储在 外部 。主控程序通过打开文件调用待分析的源程度 。
关键词 :词法分析器 ;正规式 ;自动机 中图分类号 : TP391 文献标识码 :A 文章编号 :1007 —6921 (2008) 14 —0223 —02
词法分析在教学上的主要应用是对源程序进行 分词同时验证词的合法性 ,词法分析的输入是给定 的模型语言 ,输出为单词序列 。输入的源程序可以 看成是一个字符串序列 ,通过把源程序看作字符串 序列就可以采用形式语言的一些现有理论处理相关 的编译问题 。分词的输出为ቤተ መጻሕፍቲ ባይዱ词序列 ,单词是一个 有共同含义的字符集 。由于程序设计语言中通常使 用空格来分割不同的词 ,因此初学者在理解这一概 念时可以简单的把空格分隔开的字符串认为是一个 单词 。
{ for ( ; ;)
{ Char = Get Char () ; if (isdigit (Char) ) AddChar TokenSt ring (Char) ;
else break ;
} BackChar (Char) ;
token. t ype = CON ST - ID ; token. value = atof (Buffer) ;
图 4 模型语言单词的自动机 该图已经确定化 。为了提高效率 ,还可以将图 最小化 ,即合并等价状态 ,减少状态总数 。最小化后 的状态图可以很方便的翻译为程序代码 ,而且效率 较高 。最后用直接转向法实现有限自动机 ,生成词 法分析程序 。 词法分析程序识别某类单词的部分代码如下 。 token. ch = Buffer ; for ( ; ;) { Char = Get Char () ; if (Char = = ’ n’) LineNo + + ; if ( ! isspace ( Char) ) break ; / / 如果字符不为空 结束取一个字符 } AddChar TokenSt ring (Char) ; if (isalp ha (Char) ) { for ( ; ;) { Char = Get Char () ;
图 1 标识符的自动机
Ξ 收稿日期 :2008 - 01 - 22 作者简介 :张岚 (1979 —) ,女 ,硕士 ,讲师 ,编译技术 ,内蒙古呼和浩特市人 ,内蒙古财经学院讲师 。 王鑫 (1979 —) ,女 ,本科 ,助教 ,网络技术 ,内蒙古呼和浩特市人 ,内蒙古财经学院讲师 。
·223 ·
[ 参考文献 ]
[ 1 ] 陈火旺 ,刘春林. 程序设计语言编译原理 [ M ] . 北京 :国防工业出版社 ,2000.
[ 2 ] Alf red V ·Ano , Ravi Set hi ,J eff rey D·Ullman , 编译原理[ M ] . 机械工业出版社 ,2003.
[ 3 ] 张素琴 ,吕映芝 ,蒋维杜 ,等. 编译原理 [ M ] . 北 京 :清华大学出版社 ,2005.
·224 ·
if (isalnum (Char) ) AddChar TokenSt ring (Char) ;
else break ;
} BackChar (Char) ; t = J udge (Buffer) ;
token. ch = Buffer ;
ret urn t ;
} else if (isdigit (Char) )
default :token. type = ERR TO KEN ;break ;
}
} 2 词法分析器设计注意的问题
词法分析器设计还需要注意以下问题 。 在设计程序时 ,需要为源程序设计一个符号表 , 符号表用来保存标识符信息 ,为单词语法分析和语 义分析服务 。验证了单词的合法性后 ,可以将单词 放入符号表中 ,符号表中的表项除了类型名和数值 以外还需要添加一些其他项目 。语法分析 、语义分 析时 ,从符号表中读取单词信息 ,将其他后继处理的 信息放入空白表项中保存 。 另外在处理过程中可能遇到“超前搜索”问题 。 当读入一个字符时 ,循环结束 ,不进行相关操作 。下 一次对字符操作前是要将多读入的字符回退 。 3 结语 词法分析在整个编译器设计中处于初级阶段 , 词法分析器的设计与实现相对其他几个阶段来说比 较简单 。本文中所提到的词法分析器的设计还有待 于进一步改进 。如为了实现快速的表搜索 ,可以引 入散列来设计各类需要存储的表等 。
数只给出具体的值即可 。根据以上的分析可以相应 的设计如下的存储结构 。
关键字可以设计为一个预先存储好的表格 。 标志符和常数的逻辑结构设计如下 : st ruct Token { Token - Type t char 3 ch }; 和 st ruct Token { Token - Type t double value ; }; 每个类型中的单词都有它的构成规则 。符合构 成规则的即为合法的类型 ,否则 ,为不合法 。下面给 出部分词类的正规式描述 。 < 标识符 > = < 字母 > ( < 字母 > < 数字 > ) 3 < 无符号整数 > = < 数字 > (数字) 3 < 分隔符 > = ;| ’ n’| ’’ < 运算符 > = + | - | 3 | / < 赋值运算符 > = : = 正规式是一种常用的描述单词的手段 。它简 单 、清晰 。能清楚地描述出单词的构成 。并且可以 方便的转化为单词的识别装置 ———自动机 。根据给 定的正规式得到的自动机如图 。