【编译原理】综合实验词法分析

一、程序总体结构

  • 声明实现定义的变量
  • 先构造Fist集合、Follow集合、分析预测表
  • 进行词法分析,以二元组的形式输出
  • 将输出的二元组抽离标识符ID、运算符、无符号整数NUM抽离出来组成一个字符串。
  • 传入自顶向下分析函数进行分析
  • 传入LL分析函数

二、说明各专题程序的关系

  • 专题一 :将输入的程序进行词法分析,把标识符ID、运算符、无符号整数NUM抽离出来组成一个字符串。
  • 专题二:把处理好的字符串传入专题二的函数中,进行自顶向下的分析
  • 专题三:把处理好的字符串传入专题三-七的函数中,进行自下向上的LL分析
    各个专题详情请看曾经的文章

三、测试用例

输入
在这里插入图片描述
输出
在这里插入图片描述
在这里插入图片描述

代码

# -*- coding: utf-8 -*-
import string
import re
print('词法分析器')
# 关键词
key = ('begin', 'end', 'if', 'then', 'else',
       'for', 'while', 'do', 'and', 'or', 'not')
# 分界符
delimiters = ('(', ')', ';', '',)
# 运算符
operator = ('+', '-', '*', '/', '++', '--',  # 算术运算符
            '>', '<', '>=', '<=', '=',  # 关系运算符
            ':=',  # 赋值运算符
            '<>',  # 不等关系
            ':',
            )

token = []
flage=1
# 去掉注释,获取文件
flag = 1

#__________________________________________________________________________________________________
def E():
    T()
    E1()
    print("E ->TE’")
#E’→ATE’|ε
def E1():
    global index
    if (strx[index]=="+" or strx[index]=="-" ):
        A()
        T()
        E1()
        print("E’→ATE’")
# A → + | -
def A():
    global index
    if(strx[index]=="+"):
        index += 1
        print('A → + ')
    else:
        index += 1
        print('A → - ')

def T():
    F()
    T1()
    print('T→FT’')

# F→(E) | i
def F():
    global index
    global flag
    if (strx[index] == "i"):
        index += 1
        print("F→i")
    elif strx[index]=='(':
        index += 1
        E()
        if strx[index]==')':
            index += 1
            print("F->(E)")
        else:
            flag = 0
            print("分析失败")
    else:
        flag = 0
        print("分析失败")
# T’→MFT’ |ε

def T1():
    global index
    if (strx[index]=="*" or strx[index]=="/" ):
        M()
        F()
        T1()
        print(
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值