词法分析器

来源:互联网 发布:激光打标机做图软件 编辑:程序博客网 时间:2024/05/21 22:40

实验介绍

词法分析器的功能是:输入源程序,按照构词规则分解成一系列单词符号。
单词是语言中具有独立意义的最小单位,包括关键字、标识符、运算符、界符和常量等
(1) 关键字 是由程序语言定义的具有固定意义的标识符。例如,Pascal 中的begin,end,if,while都是保留字。这些字通常不用作一般标识符。
(2) 标识符 用来表示各种名字,如变量名,数组名,过程名等等。
(3) 常数 常数的类型一般有整型、实型、布尔型、文字型等。
(4) 运算符 如+、-、*、/等等。
(5) 界符 如逗号、分号、括号、等等。

实验内容

输入: 给定一段源程序代码

int a = 1;while(a <= 10a){    a++;}

输出: token 表和 error表, 两个表都是三元组列表(行数, 单词, 类型). token表记录分析出的单词,error表记录程序代码的错误.

实现原理

c语言子集对应的状态转换图
这里写图片描述

程序源码

source.txt 中存放要分析的源程序

int a = 1;while(a <= 10a){    a++;}

main.py 存放分析程序代码

def is_alphabet(c):    # 判断是否是字母    if 'a' <= c <= 'z' or 'A' <= c <= 'Z':        return True    else:        return Falsedef is_digit(c):    # 判断是否是数字    if '0' <= c <= '9':        return True    else:        return Falsedef is_operator(c):    # 判断是否是运算符    operator = [        '+',        '-',        '*',        '/',        '=',        '<',        '>',    ]    if c in operator:        return True    else:        return Falsedef is_separator(c):    separator = [        '(',        ')',        '{',        '}',        ';',    ]    if c in separator:        return True    else:        return Falsedef process_word(n, s):    # 是否关键字    key_words = ['int', 'while']    if s in key_words:        return n, s, '关键字'    else:        return n, s, '保留字'def process_digit(n, s):    return n, s, '常数'if __name__ == '__main__':    result = list()    errors = list()    line_number = 1    for line in open('source.txt', 'r'):        index = 0        while index < len(line):            # 取下一个字符            char = line[index]            token = [char, ]            if is_alphabet(char):                # 字母开头,则提取后面的字符串:                while True:                    c = line[index + 1]                    if is_alphabet(c) or is_digit(c):                        token.append(c)                        index += 1                    elif c.strip() == '' or is_operator(c) or is_separator(c):                        break                    else:                        print('出错了!', c)                        break                # 处理token                result.append(process_word(line_number, ''.join(token)))            if is_digit(char):                flag = True                # 数字开头                while True:                    c = line[index + 1]                    if is_digit(c):                        token.append(c)                        index += 1                    elif is_alphabet(c):                        flag = False                        token.append(c)                        index += 1                    else:                        break                if flag:                    result.append(process_digit(line_number, ''.join(token)))                else:                    errors.append((line_number, ''.join(token), "标识符不能数字开头"))            if is_separator(char):                # 分隔符                result.append((line_number, char, '分隔符'))                index += 1            if is_operator(char):                c = line[index + 1]                if is_operator(c):                    token.append(c)                    index += 1                # 分隔符                result.append((line_number, ''.join(token), '运算符'))                index += 1            index += 1        line_number += 1    print('==================token表=====================')    for item in result:        print(item)    print('==================error表=====================')    for item in errors:        print(item)

实验结果

这里写图片描述

总结

程序设计语言和自然语言不一样,都是用符号来描述,每个特定的符号表示特定的意思,而且程序设计语言是上下文无关的。上下文无关就是某一个特定语句所要表达的意思和它所处的上下文没有关系,只有它自身决定。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 网上买过的东西查不到订单号怎么办 亚航的组合机票飞机延误怎么办 在微信上面对面红包被骗了钱怎么办 人欠我钱不给我怎么办 微信号被骗走然后骗了朋友钱怎么办 微信手机充值不到帐怎么办 中银香港密码器坏了怎么办 香港恒生银行的编码器丢了怎么办 淘宝拍下订单发货物流不显示怎么办 wish查到仿品审核变慢怎么办 淘宝卖家订单号错误无法修改怎么办 顺丰快递运单号微信扫描取消怎么办 买的王者荣耀号有守护平台怎么办 融e联登录密码错三次怎么办 金融e家u盾密码忘了怎么办 用工行网银转账后想取消交易怎么办 工行融e借没有密码器怎么办 工行融e借密码器丢了怎么办 工行融e联手机登录密码忘记怎么办 领导给员工抱怨工作太烦怎么办 员工抱怨忙的忙死闲的闲死怎么办 爱上骗我进传销的人该怎么办 尚赫辟谷期间吃了东西怎么办 肾结石掉在输尿管里面好痛怎么办 寄的快递快递单号找不到了怎么办 手机停机但是快递是这个号码怎么办 百世通快递卡在一个地方没动怎么办 电信无限流量20g用完了怎么办 至尊宝qq密保手机被更换怎么办 至尊宝账户密保手机被改怎么办 照片放到私密相册找不到了怎么办 出口报关报错境内货源地怎么办? 微信提现未到账交易记录删了怎么办 支付宝忘记密码就可以登陆怎么办 电脑上登陆QQ忘记密码了怎么办? 电脑被管理员限制登录微信了怎么办 快手绑定的手机号丢了登不上怎么办 快手绑定的手机号丢了登不了怎么办 苹果id有手机号不知道密码怎么办 微信号不是手机号不知道密码怎么办 手机发短信说程序发生错误怎么办