- 1、本文档共17页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
编译原理知识点参考课案
第三章
3.1 对于词法分析器的要求
1.词法词法分析的任务:从左至右逐个字符地对源程序进行扫描,产生一个个单词符号。
词法分析器(Lexical Analyzer) 又称扫描器(Scanner):执行词法分析的程序。
2.程序语言的单词符号:关键字、标识符、常数、运算符、界符。
3.输出的单词符号的表示形式:
(单词种别,单词自身的值)
Eg:
while (i=j) i--;
输出单词符号:
while, -
(, -
id, 指向i的符号表项的指针
=, -
id, 指向j的符号表项的指针
), -
id, 指向i的符号表项的指针
--, -
;, -
4.词法分析器作为一个独立子程序:结构简洁、清晰和条理化,有利于集中考虑词法分析一些枝节问题。
5.词法分析器
3.2 词法分析器的设计
1.词法分析器
2.输入、预处理:
输入串放在输入缓冲区中。
预处理子程序:剔除无用的空白、跳格、回车和换行等编辑性字符;区分标号区、捻接续行和给出句末符等
扫描缓冲区(指向开始位置,向前搜索确定终点)
3.单词符号的识别、超前搜索:
(1)基本字识别
Eg:
DO99K=1,10 DO 99 K = 1,10
IF(5.EQ.M)GOTO55 IF (5.EQ.M) GOTO 55
DO99K=1.10
IF(5)=55
需要超前搜索才能确定哪些是基本字
(2)标识符
(3)常数
(4)算符和界符
4.状态转换图(有限方向图)
1结点代表状态
2状态之间用箭弧连结,箭弧上的标记(字符)代表射出结状态下可能出现的输入字符或字符类。
3一个状态转换图可用于识别(或接受)一定的字符串。
5.语法分析的状态转换图
6.状态转换图的实现
思想:每个状态结对应一小段程序。
7.状态转换图实现(了解)
1)ch 字符变量、存放最新读入的源程序字符
2)strToken 字符数组,存放构成单词符号的字符串
3)GetChar 子程序过程,把下一个字符读入到 ch 中
4)GetBC 子程序过程,跳过空白符,直至 ch 中读入一非空白符
5)Concat 子程序,把ch中的字符连接到 strToken
6)IsLetter和 IsDisgital 布尔函数,判断ch中字符是否为字母和数字
7) Reserve 整型函数,对于 strToken 中的字符串查找保留字表,若它是保留字则给出它的编码,否则回送0
8) Retract 子程序,把搜索指针回调一个字符位置
9)InsertId 整型函数,将strToken中的标识符插入符号表,返回符号表指针
10)InsertConst 整型函数过程,将strToken中的常数插入常数表,返回常数表指针。
8.一个词法分析器的例子(多看看、了解吧):
int code, value;
strToken := “ ”; /*置strToken为空串*/
GetChar(); GetBC();
if (IsLetter())
begin
while (IsLetter() or IsDigit())
begin
Concat(); GetChar();
end
Retract();
code := Reserve();
if (code = 0)
begin
value := InsertId(strToken);
return ($ID, value);
end
else
return (code, -);
end
else if (IsDigit())
begin
while (IsDigit())
begin
Concat( ); GetChar( );
end
Retract();
value := InsertConst(strToken);
return($INT, value);
end
else if (ch =‘=’) return ($ASSIGN, -);
else if (ch =‘+’) return ($PLUS, -);
else if (ch =‘*’)
begin
GetChar();
if (ch =‘*’) return ($POWER, -);
Retract(); return ($STAR, -);
end
else if (ch =‘;’) return ($SEMICOLON, -);
else if (ch =‘(’) return ($LPAR, -);
else if (ch =‘)’) return ($RPAR, -);
else ProcError( ); /* 错误处理*/
3.3正规表达式和有限自
文档评论(0)