- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第三章 词法分析;源程序;3.1对词法分析器的要求;单词符号的表示形式:词法分析器所输出的单词符号常常表示成
二元式(单词种别,单词自身的值)。
单词种别可以用以下形式表示:
1、一类单词统一用一个整数值代表其属性。例如:1代表关键字,2代表标识符等。
2、每一个单词一个类别。例如:1代表BEGIN,2代表END等。
单词自身的值可以表示成:常量的二进制表示;常量、变量等在符号表种的地址码,等等。;例3-1:151-FORTRAN编译程序的词法分析器在扫描输入串
IF (5·EQ·M) GOTO 100 后,它输出的单词符号串是: ;例3-2 :下述C++代码段:while ( i = j ) i - -;
经词法分析器处理以后,它将被转换为如下的单词符号串 ;3.1.2词法分析与语法分析的关系;;若识别输入语句 IF (5.EQ.M) GOTO 100,若缓冲区情况如下所示:;3.2.2单词符号的识别——超前搜索;
标识符的识别
多数语言的标识符是字母开头的“字母/数字”串,而且在程序中标识符的出现后都跟着算符或界符。因此,不难识别。
常数的识别
对于某些语言的常数的识别也需要使用超前搜索。
算符和界符的识别
对于诸如C++语言中的“+ +”、“- -”,这种复合成的算符,需要超前搜索。
;3.2.3状态转换图;1;图3.2 状态转换图;;*;3.2.4状态转换图的实现; 以上函数和子程序过程都不难编制,使用它们能够方便的构造状态转换图的对应程序。一般,我们可以让每一个状态结对应一个程序段。
例如:我们可以让不含回路的分叉结,对应一个CASE 语句,或者是一组IF…THEN…ELSE语句。具体见后面实例。
终态结一般对应一个RETURN(C,VAL)语句。其中C为单词种别编码;VAL是字符数组的TOKEN ,或者是一个整数值,或者无定义。具体见后面实例。; 为了把状态转换图转化成程序,每个状态要建立一段
程序,它要做的工作如下:
第一步:从输入缓冲区中取一个字符。为此,我们使用函数GETCHAR,每次调用它,推进先行指针,送回一个字符。
第二步:确定在本状态下,哪一条箭弧是用刚刚来的输入字符标识的。如果找到,控制就转到该弧所指向的状态;若找不到,那么寻找该单词的企图就失败了。
失 败:先行指针必须重新回到开始指针处,并用另一状态图来搜索另一单词。如果所有的状态转换图都试过之后,还没有匹配的,就表明这是一个词法错误,此时,调用错误校正程序。;例3-6:以下CASE语句段对应的状态图:
state i: GETCHAR;
CASE CHAR OF
‘A’..‘Z’:… state j … ;
‘0’..‘9’:… state k … ;
‘/’ :… state l … ;
END;
FAIL;对于如上的状态转换图,状态0的代码如下所示:
state 0: C := GETCHAR ;
if LETTER(C) then goto state 1
else FAIL( );对于如上的状态转换图,状态1的代码如下所示:
state 1: C := GETCHAR ;
if LETTER( C) or DIGIT(C)
then goto state 1
else if DELIMITER(C)
then goto state 2
else FAIL( );对于如上的状态转换图,终态——状态2的代码如下所示:
state 2: RETRACT( ) ;
RETURN($id ,INSTALL( ) );例3-8:以下程序段对应的状态图
state i:GETCHAR;
WHILE LETTER OR DIGIT DO GETCHAR;
state j:… ;例3-9:以下程序段对应的状态图
‘0’… ‘9’:BEGIN
WHILE DIGIT DO
BEGIN CONCAT;GETCHAR END;
文档评论(0)