词法分析
词法分析时,依次读入源程序中的每个字符,依据语言的构词规则,识别出一个个具有独立意义的最小语法单位,即“单词”,并用某个单词符号来表示每个单词的词性是标识符、分界符还是数。
TEST语言词法规则
详细规则参照原书附录 A.1
TEST语言的单词符号如下:
标识符(identifier):字母打头,后接字母数字,用ID标识
保留字(keyword) :if、while、for等, 直接用保留字标识
无符号整数 (number): 数字组成,用NUM标识
分界符 :单分界符(sigleword) + - * / 等 ; 双分界符 >= 等
注释符 :/* 和 */
正则文法见原书
词法分析程序设计
原书代码通过逐字读取源代码文件进行分析,将分析结果以 “词性 + 单词” 的形式输出到文件中保存。笔者稍微改进了输出方式:将每个单词以字典的形式保存在了”words.josn“文件当中,其中每个单词的字典包含了词性 “type” 和 本身的值 “value” 。
词法分析仍采用逐字读取,并严格按照词法的正则文法进行分析。
分析过程中同时进行检测错误。
更新 2019/10/14
加入新关键词 ‘do’, ‘switch’, ‘case’, ‘break’, ‘continue’
words_analysis.py
import json
from myexception import MyException, error_path
code_file_name = 'source_code.txt'
noneword = [' ', '\t', '\n']
keyword = ['if', 'else', 'elif', 'for', 'while', 'do', 'int', 'read',
'write', 'switch', 'case', 'break', 'continue']
singleword = '+-*(){},;:'
doubleword = '><=!'
doublewords = ['>=', '<=', '==', '!=']
noteword = '/'
@error_path