前言:关于词法分析的基础知识的介绍可以看一下这篇博客,我再累述估计也不会有这篇讲的清楚QAQ。 https://www.cnblogs.com/yanlingyin/archive/2012/04/17/2451717.html 默认大家已经对词法分析有了基本的了解了。
一:下面讨论PL/0语言的词法分析器的单词结构
1、关键字
关键字(共11个):空格分隔列表如下
begin end if then while do const var call procedure odd
2、运算符和界符
算符和界符(14个):空格分隔列表如下
+ - * / = # < > := ( ) , . ;
3、标示符
PL/0语言中标示符的定义为:开头可以是下划线或字母,后面可以是下划线、字母或数字。
4、常数
整形数和浮点数
5、空白符
PL/0语言中的空白符有:空格符、制表符、换行符,这些空白符在词法分析阶段可以被忽略。
6、注释
PL/0语言中的注释形式为//,可以多行注释(*…*)。
二:PL/0的语言的词法分析器将要完成以下工作
(1) 跳过分隔符(如空格,回车,制表符);
(2) 识别诸如begin,end,if,while等关键字;
(3) 识别非关键字的一般标识符。
(4) 识别常数数字序列。
(5) 识别前面列出的单字符操作符和:=双字符特殊符号。
(6)词法分析器的输出形式(种别,属性值)其中:种别在“2、单词的种别”中进行了定义;
属性值:若单词种别只代表唯一单词,属性值为空;
若单词种别是标识符,为该单词在标识符表中的位置;
若单词种别是常数,属性值为对应常数值。
三:代码实现
测试程序如下(我放置的路径为D:/b.txt,根据自己情况自行修改)
1 // PL/0 语法示例程序 2 3 (* 4 计算1~10的阶乘 5 多行注释 6 *) 7 8 var n, f; 9 begin 10 n := 0; 11 f := 1; 12 while n # 10 do 13 begin 14 n := n + 1; 15 f := f * n; 16 end; 17 call print;// 用于输出结果,假设预先声明 18 end.