法分析阶段的基本任务是从以字符串表示的源程序中识别出具有独立意义的单词符号。通过DOS环境手动输入字符串序列(以’’作为结束标志)作为带分析的源程序,调用词法扫描子程序将字符串以二元组的形式输出(若有不属于该语言单词符号出现,则进行出错处理),词法扫描子程序包括了对源程序的预处理(忽略、回车换行符等字符)以及对单词的识别和分类,,以形成(单词种别,单词自身的值)形式的二元组。具体思路如下:首先建立关键字表,将关键字作为特殊标示符处理,把它们预先安排在charkeywords13中,将需要被识别出的关键字存入表中,当扫描程序识别出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。在主函数中让用户输入要识别的符号串,然后将输入的符号串读入到program500,遇结束。再依次扫描program500中的每一个符号,调用Sca
子函数分析每一个符号,再将分析的结果输出,也是遇结束。2函数说明和数据结构:在Sca
子函数中,先全部初始化,然后读一个字符,分析它是什么类型如果是字母类型,则接着往下读,直到读到非字母的字符,存入words10中,依次对比关键字表中的元素,如果相同,则将flags置为相应的种别码,如果全都扫描后没发现相同的关键字,则为普通的标识符返回主函数输出。如果是数字类型,首先分析第一个符号,接着读下一个字符串,直到读到一个不是数字的字符串位置,每读一个数字字符,就将他们转化为相应的数字,使用辗转相乘法,每次都让
umber先自乘10,然后加上这个数字,这样就将字符串表示的数字转化成了相应的数,返回主函数输出。如果是其他单词表的符号,则将他们的flags置为相应的种别码,并将字符存到words中返回主函数输出。主要变量说明:用words10存放构成单词符号的字符串,并且用于判断是否为关键字。flags500存放单词符号的种别码。Number存放整数值,words存放标识符,关键字或者其他符号。c
t
um按顺序存放读到的字符,为下面语义分析做准备。Status用于判断是否为关键字,1是,0不是。
f3具体的种别编码和内部值:
单词符号i
tcharfloatifelsedowhilepri
tfmai
标识符常数(整)种别编码123456789100200401402403404405406407408409410411412413414415416417418419501502503504505506507508内部字符串二进制数值表示单词值
f“空格
5095105115125135145150
4流程图:主流程图
扫描程序流程图:
a,r