这里刚开始试用python的函数功能,可能把局部变量和全局变量给写乱了,后期交之前还想再优化的时候发现越改越乱,太真实的hhh

实验四:语法分析器1–预测分析器构造

实验目的: 通过编写一个预测分析器,掌握自上而下构造语法分析器的方法之一------预测分析法。

实验要求:

1、该语法分析器的任务如下:
(1) 可识别程序代码中符合以下文法中的3-5个,返回该语句为何种语句,或提示出错
文法G1:
L→E
E→E=T|T
E→E+T|T
T→T-F|F
F→(E)|id

文法G2:
L→E
E→E=T|T
E→E*T|T
T→T/F|T%F|F
F→(E)|id

文法G3:
D→TL
T→int|flort
L→id R
R→,id R|ε

文法G4:
L →E;L|ε
E →TE’
E’→+TE’|-TE’|ε
T →FT’
T’→*FT’|/FT’|mod FT’|ε
F →(E)|id|num

文法G5:
stmt→if expr then stmt else stmt
|if expr then stmt
|other
(2)出错处理可自行设计,并添加在预测分析表中

测试用例:

#include <stdio.h>
#include  <math.h>
int main ( ) {int a,b,c,disc,x1,x2,p,q;
scanf("%lf%lf%lf",&a,&b,&c);
sqrt=(b*b)/(4*a*c)  disc=b+b-a+c;if (disc<0) p=2.0*a;else  p=-b/(2.0*a)printf("x1=%7.2f\nx2=%7.2f\n",x1,x2);          }return 0;
}

环境:python 2.7 IDE:pyCharm

实验代码

因为还是用了之前实验2,3的内容,所以list还是这些

# -*- coding: UTF-8 -*-
# 设置列表
list0 = ['IF', 11, 'THEN', 12, 'ELSE', 13, 'INT', 14, 'CHAR', 15, 'FOR', 16]
list1 = ['{', 90, '}', 91, '(', 92, ')', 93]
list2 = ['=', 21, '>=', 22, "==", 23, '+', 24,  '/', 25, '%', 26, '++', 27, '"', 28, ';', 29]    # 运算符
list4 = []    # 数字  动态添加
list5 = []    # 变量名  动态添加,检查是否存在

基本就是之前实验2的东西,作为一个分割函数

def splitfuc():list_fin = []list_temp = []fo = open("*****路径\\test3.txt", "r")str_1 = fo.readlines()fo.close()# print str_1for y in range(len(str_1)):list_temp = list_temp + str_1[y].split(' ')   # 突然发现这应该一句话就能解决hhhy = 0p = len(list_temp)# print list_tempwhile y < p:if list_temp[y] == '':del list_temp[y]p = p - 1else:y = y + 1# print list_tempfo = open("C:\\Users\\Launcher-Z\\Desktop\\3_output.txt", "w")# 开始从第一个单词循环j = 0k = 0# 开始遍历for idx in range(len(list_temp)):str_new = list_temp[idx]i = 0while i < len(str_new):if 'a' <= str_new[i] <= 'z' or 'A' <= str_new[i] <= 'Z':if i != len(str_new)-1:end = i + 1while end < len(str_new):if 'a' <= str_new[end] <= 'z' or 'A' <= str_new[end] <= 'Z' or '0' <= str_new[end] <= '9':end = end + 1else:end = end - 1breakif i != end:tmp = str_new[i:end+1]if tmp.upper() in list0:list_fin = list_fin + [tmp]fo.write(tmp)fo.write(' ')else:if tmp not in list5:list5.append(tmp)list5.append(50 + k)k = k + 1list_fin = list_fin + [tmp]fo.write(tmp)fo.write(' ')else:list_fin = list_fin + [tmp]fo.write(tmp)fo.write(' ')i = end + 1continueelse:tmp = str_new[i]if tmp not in list5:list5.append(tmp)list5.append(50 + k)k = k + 1list_fin = list_fin + [tmp]fo.write(tmp)fo.write(' ')else:list_fin = list_fin + [tmp]fo.write(tmp)fo.write(' ')i = end + 1continueelse:tmp = str_new[i]if tmp not in list5:list5.append(tmp)list5.append(50 + k)k = k + 1list_fin = list_fin + [tmp]fo.write(tmp)fo.write(' ')else:list_fin = list_fin + [tmp]fo.write(tmp)fo.write(' ')i = i + 1continueelse:if '0' <= str_new[i] <= '9':sum_1 = 0sum_2 = 0.0flg_num = 0x = 1while i < len(str_new):if '0' <= str_new[i] <= '9':if flg_num == 0:sum_1 = sum_1 * 10 + int(str_new[i])i = i + 1else:sum_2 = sum_2 + int(str_new[i]) * (0.1 ** x)x = x + 1i = i + 1else:if str_new[i] == '.':i = i + 1flg_num = 1if str_new[i] <= '0' or str_new[i] >= '9':list_fin = list_fin + [sum_1]fo.write(str(sum_1))fo.write('.')fo.write(str_new[i])fo.write(' ')num_end = ii = i + 1breakelse:continueelse:num_end = iif flg_num == 0:if sum_1 not in list4:list4.append(sum_1)list4.append(40 + j)j = j + 1list_fin = list_fin + [sum_1]fo.write(str(sum_1))fo.write(' ')breakelse:sum_2 = sum_2 + sum_1if sum_2 not in list4:list4.append(sum_2)list4.append(40 + j)j = j + 1list_fin = list_fin + [sum_2]fo.write(str(sum_2))fo.write(' ')breaki = num_end-1else:# = 与 ==if str_new[i] == '=':if str_new[i + 1] == '=':list_fin = list_fin + ['==']fo.write('==')fo.write(' ')i = i + 1else:list_fin = list_fin + ['=']fo.write('=')fo.write(' ')else:# < 与 <=if str_new[i] == '>':if str_new[i + 1] == '=':list_fin = list_fin + ['>=']fo.write('>=')fo.write(' ')i = i + 1else:list_fin = list_fin + ['>']fo.write('>')fo.write(' ')else:# + 与 ++if str_new[i] == '+':if str_new[i + 1] == '+':list_fin = list_fin + ['++']fo.write('++')fo.write(' ')i = i + 1else:list_fin = list_fin + ['+']fo.write('+')fo.write(' ')else:if str_new[i] == '/':list_fin = list_fin + ['/']fo.write('/')fo.write(' ')else:if str_new[i] == '%':list_fin = list_fin + ['%']fo.write('%')fo.write(' ')else:if str_new[i] == '"':list_fin = list_fin + ['"']fo.write('"')fo.write(' ')else:if str_new[i] == ';':list_fin = list_fin + [';']fo.write(';')fo.write(' ')else:if str_new[i] == '{':list_fin = list_fin + ['{']fo.write('{')fo.write(' ')else:if str_new[i] == '}':list_fin = list_fin + ['}']fo.write('}')fo.write(' ')else:if str_new[i] == '(':list_fin = list_fin + ['(']fo.write('(')fo.write(' ')else:if str_new[i] == ')':list_fin = list_fin + [')']fo.write(')')fo.write(' ')else:if str_new[i] == '\n':fo.write('\n')else:# 错误判断,一般就是符号错误,最多2个,看下一位'='判断if str_new[i] not in list2 and list1:if i != len(str_new) - 1:if str_new[i + 1] == '=':list_fin = list_fin + [str_new[i: i + 2]]fo.write(str_new[i: i + 2])fo.write(' ')i = i + 1else:list_fin = list_fin + [str_new[i]]fo.write(str_new[i])fo.write(' ')else:list_fin = list_fin + [str_new[i]]fo.write(str_new[i])fo.write(' ')i = i + 1return list_fin    # 分割函数

开始准备要用到的数据结构

stack = []    # 模拟的一个堆栈
# G3 文法分析表
dict_G3 = {'G3': ['int', 'float', ',', 'id', '#'],'D': ['B G', 'B G', 'err', 'err', 'err'],'B': ['int', 'float', 'err', 'err', 'err'],'G': ['err', 'err', 'id R', 'id R', 'err'],'R': ['err', 'err', ', id R', 'err', 'Null']
}
# G4 文法分析表
dict_G4 = {'G4': ['id', 'num', '(', '+', '-', '*', '/', 'mod', ';', ')', '#'],'L': ['E ; L', 'E ; L', 'E ; L', 'err', 'err', 'err', 'err', 'err', 'err', 'err', 'Null'],'E': ['T e', 'T e', 'T e', 'err', 'err', 'err', 'err', 'err', 'err', 'err', 'err'],'e': ['err', 'err', 'err', '+ T e', '- T e', 'err', 'err', 'err', 'Null', 'Null', 'err'],'T': ['F t', 'F t', 'F t', 'err', 'err', 'err', 'err', 'err', 'err', 'err', 'err'],'t': ['err', 'err', 'err', 'Null', 'Null', '* F t', '/ F t', 'mod F t', 'Null', 'Null', 'err'],'F': ['id', 'num', '( E )', 'err', 'err', 'err', 'err', 'err', 'err', 'err', 'err']
}
# G5 文法分析表1.0
dict_G5 = {'G5': ['if', 'else', 'then', 'string', '#'],'S': ['if E then S s', 'err', 'err', 'E', 'err'],'s': ['err', 'else S', 'err', 'err', 'Null'],'E': ['err', 'err', 'err', 'string', 'err']
}# 判断str的first是在哪个字典中,从而选择哪个函数进行预测分析
str_spl = splitfuc()
print str_spl  # 全局变量,处理后分隔好的list

接下去新建一个list用来保存这个语法允许的首个词是啥,不允许的就用err代替

# G3_check 处理
list_check_G3_first = []
for index in range(len(dict_G3['G3'])):list_check_G3_first = list_check_G3_first + [dict_G3['G3'][index]] #检查first的list_check,从而选择文法
for index in range(len(dict_G3['G3'])):if dict_G3['D'][index] == 'err':list_check_G3_first[index] = 'err'
# print 'xxxxxxxxxxx check_G3_first'
# print list_check_G3_first
# print 'xxxxxxxxxxx G3'
# print dict_G3['G3']# G4_check 处理
list_check_G4_first = []
for index in range(len(dict_G4['G4'])):list_check_G4_first = list_check_G4_first + [dict_G4['G4'][index]]  # 检查first的list_check,从而选择文法
for index in range(len(dict_G4['G4'])):if dict_G4['L'][index] == 'err':list_check_G4_first[index] = 'err'
# print 'xxxxxxxxxxx check_G4_first'
# print list_check_G4_first
# print 'xxxxxxxxxxx G4'
# print dict_G4['G4']# G5_check 处理
list_check_G5_first = []
for index in range(len(dict_G5['G5'])):list_check_G5_first = list_check_G5_first + [dict_G5['G5'][index]]  # 检查first的list_check,从而选择文法
for index in range(len(dict_G5['G5'])):if dict_G5['S'][index] == 'err':list_check_G5_first[index] = 'err'
# print 'xxxxxxxxxxx check_G5_first'
# print list_check_G5_first
# print 'xxxxxxxxxxx G5'
# print dict_G5['G5']

对G3文法的处理函数,应该是有史以来自己写代码时候注释最清楚的了hhh

def func_g3(str_spl):# 处理成输入符号----  w#  替换 非在 G3 内的终结符为    'id'  可以放在G3函数中 输入的东西为处理好的str_spl# 如果语句的首个词在list_check中,则选择那个文法的处理函数str_spl_cpy = []for index in range(len(str_spl)):str_spl_cpy = str_spl_cpy + [str_spl[index]]  # 复制listfor index in range(len(str_spl)):if str_spl[index] in dict_G3['G3']:continueelse:str_spl_cpy[index] = 'id'str_spl_cpy = str_spl_cpy + ['#']# cpy比原来的list中多了 # 其他的id什么的都 index 从原list中返回真实的print 'xxxxxxxxxxx spl_cpy'print str_spl_cpy# 开始遍历cpy的list,进行对stack的操作stack = ['#', 'D']    # 初始状态# for index in range(len(str_spl_cpy)):# print 'xxxxxxxxxxx test stack'# print dict_G3['D']# print dict_G3[stack[1]]# 开始循环# 1.查看栈顶元素# 2.目前的spl_cpy[index]在G3中的index_2是多少# 3.栈顶元素对应的list[index_2](是否存在)如D[index_2]是‘B G’# 4.弹出栈顶,按空格分开反向入栈# 5.判断栈顶是否=spl_cpy[index] ----是则弹出栈顶元素并输出,index下一个;----不是则重复1-5# 可以打包成G3处理函数index = 0list_after_check = []# 开始循环,按照输入流中的一步一步走while str_spl_cpy[index] != '#':while stack[len(stack)-1] != str_spl_cpy[index]:   # 推进栈中更新list_temp = []if str_spl_cpy[index] in dict_G3['G3']:index_2 = dict_G3['G3'].index(str_spl_cpy[index])else:print 'error1 含有语法定义中未存在的元素'breakif dict_G3[stack[len(stack)-1]][index_2] != 'err':if dict_G3[stack[len(stack)-1]][index_2] == 'Null':print '***弹出了:', stack[len(stack) - 1]stack.remove(stack[len(stack) - 1])else:list_temp = dict_G3[stack[len(stack) - 1]][index_2].split(' ')list_temp.reverse()print 'temp\n', list_tempprint 'stack before \n', stackstack.remove(stack[len(stack) - 1])stack = stack + list_tempprint 'stack after\n', stackelse:print 'error1 含有语法定义中未存在的元素'breakprint '弹出了:', stack[len(stack)-1]print '是原来的:', str_spl[index]list_after_check = list_after_check + [str_spl[index]]stack.remove(stack[len(stack)-1])index = index + 1print '目前到达的输入流位置指向:', str_spl_cpy[index]# 输入流指针已经到了最后,开始清空堆栈里的东西while len(stack) > 1:index_2 = dict_G3['G3'].index(str_spl_cpy[index])if dict_G3[stack[len(stack) - 1]][index_2] != 'err':if dict_G3[stack[len(stack)-1]][index_2] == 'Null':print 'stack before \n', stackprint '弹出了:', stack[len(stack) - 1]stack.remove(stack[len(stack) - 1])print 'stack after\n', stackelse:print 'error2 没有按照语法'else:print 'error1 有语法定义中未存在的元素'print '这是语法G3,经过循环遍历之后的原来语句是:', list_after_check# G3函数结束

对G4文法的处理函数

def func_g4(str_spl):str_spl_cpy = []for index in range(len(str_spl)):str_spl_cpy = str_spl_cpy + [str_spl[index]]  # 复制listfor index in range(len(str_spl)):if str_spl[index] in dict_G4['G4']:continueelse:if isinstance(str_spl_cpy[index], int):str_spl_cpy[index] = 'num'else:if 'a' <= str_spl_cpy[index][0] <= 'z' or 'A' <= str_spl_cpy[index][0] <= 'Z':str_spl_cpy[index] = 'id'else:continuestr_spl_cpy = str_spl_cpy + ['#']# cpy比原来的list中多了 # 其他的id什么的都 index 从原list中返回真实的print 'xxxxxxxxxxx spl_cpy'print str_spl_cpy# 开始遍历cpy的list,进行对stack的操作stack = ['#', 'L']  # 初始状态# for index in range(len(str_spl_cpy)):# print 'xxxxxxxxxxx test stack'# print dict_G3['D']# print dict_G3[stack[1]]# 开始循环# 1.查看栈顶元素# 2.目前的spl_cpy[index]在G3中的index_2是多少# 3.栈顶元素对应的list[index_2](是否存在)如D[index_2]是‘B G’# 4.弹出栈顶,按空格分开反向入栈# 5.判断栈顶是否=spl_cpy[index] ----是则弹出栈顶元素并输出,index下一个;----不是则重复1-5# 可以打包成G3处理函数index = 0flg = 0list_after_check = []# 开始循环,按照输入流中的一步一步走while str_spl_cpy[index] != '#':while stack[len(stack) - 1] != str_spl_cpy[index]:  # 推进栈中更新list_temp = []if str_spl_cpy[index] in dict_G4['G4']:index_2 = dict_G4['G4'].index(str_spl_cpy[index])else:print 'error1 含有语法定义中未存在的元素'flg = 1breakif dict_G4[stack[len(stack) - 1]][index_2] != 'err':if dict_G4[stack[len(stack) - 1]][index_2] == 'Null':print '遇到ε弹出了:', stack[len(stack) - 1]stack.remove(stack[len(stack) - 1])else:list_temp = dict_G4[stack[len(stack) - 1]][index_2].split(' ')list_temp.reverse()print 'temp\n', list_tempprint 'stack before \n', stackstack.remove(stack[len(stack) - 1])stack = stack + list_tempprint 'stack after\n', stackelse:print 'error1 含有语法定义中未存在的元素'flg = 1breakif flg == 1:breakprint '弹出了:', stack[len(stack) - 1]print '是原来的:', str_spl[index]list_after_check = list_after_check + [str_spl[index]]stack.remove(stack[len(stack) - 1])index = index + 1print '目前到达的输入流位置指向:', str_spl_cpy[index]print '目前的stack里面有:', stackprint '目前到达的输入流位置指向:', str_spl_cpy[index]print '目前的stack里面有:', stack# 输入流指针已经到了最后,开始清空堆栈里的东西if flg != 1:while len(stack) > 1:index_2 = dict_G4['G4'].index(str_spl_cpy[index])if dict_G4[stack[len(stack) - 1]][index_2] != 'err':if dict_G4[stack[len(stack) - 1]][index_2] == 'Null':print 'stack before \n', stackprint '遇到ε弹出了:', stack[len(stack) - 1]stack.remove(stack[len(stack) - 1])print 'stack after\n', stackelse:print 'error2 没有按照语法来写语句'flg = 1breakelse:flg = 1print 'error2 没有按照语法来写语句(末尾缺少 ; )'breakif flg != 1:print '这是语法G4,经过循环遍历之后的原来语句是:', list_after_checkelse:print '虽然开头对应了文法G4,但是他里面存在不符合文法的字符或中间没按照文法写'else:print '虽然开头对应了文法G4,但是他里面存在不符合文法的字符或中间没按照文法写'# G4函数结束

对G5文法的处理函数,后面堆栈操作基本都一个样,其实可以再写个堆栈操作函数的,那个时候怠惰了

def func_g5(str_spl):str_temp = ''list_temp_for_g5 = []str_spl_cpy = []for index in range(len(str_spl)):str_spl_cpy = str_spl_cpy + [str_spl[index]]  # 复制liststr_spl_cpy = str_spl_cpy + ['#']# 先拼接起来index = 0while str_spl_cpy[index] != '#':if str_spl_cpy[index] != 'if':if str_spl_cpy[index] != 'else':if str_spl_cpy[index] != 'then':str_temp = str_temp + str_spl_cpy[index]else:list_temp_for_g5 = list_temp_for_g5 + [str_temp]str_temp = ''list_temp_for_g5 = list_temp_for_g5 + ['then']else:list_temp_for_g5 = list_temp_for_g5 + [str_temp]str_temp = ''list_temp_for_g5 = list_temp_for_g5 + ['else']else:list_temp_for_g5 = list_temp_for_g5 + [str_temp]str_temp = ''list_temp_for_g5 = list_temp_for_g5 + ['if']index = index + 1list_temp_for_g5 = list_temp_for_g5 + [str_temp]while '' in list_temp_for_g5:list_temp_for_g5.remove('')print 'xxxxxxxxxxx list temp for g5'print list_temp_for_g5# 再替换str内容为string 准备处理str_spl_cpy = []for index in range(len(list_temp_for_g5)):str_spl_cpy = str_spl_cpy + [list_temp_for_g5[index]]  # 复制liststr_spl_cpy = str_spl_cpy + ['#']str_spl_cpy_g5 = []for index in range(len(str_spl_cpy)):str_spl_cpy_g5 = str_spl_cpy_g5 + [str_spl_cpy[index]]  # 复制listfor index in range(len(str_spl_cpy_g5)):if str_spl_cpy_g5[index] != 'if':if str_spl_cpy_g5[index] != 'else':if str_spl_cpy_g5[index] != 'then':if str_spl_cpy_g5[index] != '#':str_spl_cpy_g5.insert(index, 'string')str_spl_cpy_g5.remove(str_spl_cpy_g5[index + 1])# cpy比原来的list中多了 # 其他的id什么的都 index 从原list中返回真实的print 'xxxxxxxxxxx spl_cpy'print str_spl_cpyprint 'xxxxxxxxxxx spl_cpy_g5'print str_spl_cpy_g5# 开始遍历cpy的list,进行对stack的操作stack = ['#', 'S']  # 初始状态# 开始循环# 1.查看栈顶元素# 2.目前的spl_cpy[index]在G3中的index_2是多少# 3.栈顶元素对应的list[index_2](是否存在)如D[index_2]是‘B G’# 4.弹出栈顶,按空格分开反向入栈# 5.判断栈顶是否=spl_cpy[index] ----是则弹出栈顶元素并输出,index下一个;----不是则重复1-5# 可以打包成G3处理函数index = 0flg = 0list_after_check = []# 开始循环,按照输入流中的一步一步走while str_spl_cpy_g5[index] != '#':while stack[len(stack) - 1] != str_spl_cpy_g5[index]:  # 推进栈中更新list_temp = []if str_spl_cpy_g5[index] in dict_G5['G5']:index_2 = dict_G5['G5'].index(str_spl_cpy_g5[index])else:print 'error1 含有语法定义中未存在的元素'flg = 1breakif dict_G5[stack[len(stack) - 1]][index_2] != 'err':if dict_G5[stack[len(stack) - 1]][index_2] == 'Null':print '遇到ε弹出了:', stack[len(stack) - 1]stack.remove(stack[len(stack) - 1])else:list_temp = dict_G5[stack[len(stack) - 1]][index_2].split(' ')list_temp.reverse()print 'temp\n', list_tempprint 'stack before \n', stackstack.remove(stack[len(stack) - 1])stack = stack + list_tempprint 'stack after\n', stackelse:print 'error1 含有语法定义中未存在的元素'flg = 1breakif flg == 1:breakprint '弹出了:', stack[len(stack) - 1]print '是原来的:', str_spl_cpy[index]list_after_check = list_after_check + [str_spl_cpy[index]]stack.remove(stack[len(stack) - 1])index = index + 1print '目前到达的输入流位置指向:', str_spl_cpy_g5[index]print '目前的stack里面有:', stackprint '目前到达的输入流位置指向:', str_spl_cpy_g5[index]print '目前的stack里面有:', stack# 输入流指针已经到了最后,开始清空堆栈里的东西if flg != 1:while len(stack) > 1:index_2 = dict_G5['G5'].index(str_spl_cpy_g5[index])if dict_G5[stack[len(stack) - 1]][index_2] != 'err':if dict_G5[stack[len(stack) - 1]][index_2] == 'Null':print 'stack before \n', stackprint '遇到ε弹出了:', stack[len(stack) - 1]stack.remove(stack[len(stack) - 1])print 'stack after\n', stackelse:print 'error2 没有按照语法来写语句'flg = 1breakelse:flg = 1print 'error2 没有按照语法来写语句(末尾缺少 ; )'breakif flg != 1:print '这是语法G5,经过循环遍历之后的原来语句是:', list_after_checkelse:print '虽然开头对应了文法G5,但是他里面存在不符合文法的字符或中间没按照文法写'else:print '虽然开头对应了文法G5,但是他里面存在不符合文法的字符或中间没按照文法写'# G5函数结束

判断哪个文法的函数

def choose_gn(str_spl):str_cpy_g3 = []str_cpy_g4 = []str_cpy_g3 = str_cpy_g3 + [str_spl[0]]str_cpy_g4 = str_cpy_g4 + [str_spl[0]]if str_cpy_g3[0] not in dict_G3['G3']:        # G3str_cpy_g3[0] = 'id'if isinstance(str_cpy_g4[0], int):            # G4str_cpy_g4[0] = 'num'else:if 'a' <= str_cpy_g4[0][0] <= 'z' or 'A' <= str_cpy_g4[0][0] <= 'Z':str_cpy_g4[0] = 'id'if str_spl[0] == 'if':func_g5(str_spl)else:if str_cpy_g3[0] in list_check_G3_first:func_g3(str_spl)else:if str_cpy_g4[0] in list_check_G4_first:func_g4(str_spl)else:print 'err3,目前没有文法匹配该语句'

最后执行

choose_gn(str_spl)

代码结束

问题讨论

本来还想再进一步对if else 语句中的嵌套语句做一个嵌套分析的难度应该也不大,但是最后就是越改越乱了

从0开始的python学习:编译原理实验4:语法分析器1--预测分析器构造相关推荐

  1. 编译原理实验-LL1语法分析器(自动生成First集、Follow集求法)java实现

    编译原理实验-LL1语法分析器(自动生成First.Follow)java 博主在做实验时,参考众多他人代码,发现bug众多,在@moni_mm代码基础上,与伙伴把能看到的BUG都做出修正,同时增添了 ...

  2. 编译原理 实验2 语法分析器的构造

    [实验目的] 练习构造语法分析程序的方法,熟悉上下文无关文法的使用,加深对课堂教学的理解:提高词法分析方法的实践能力 [实验要求] 利用某一高级程序设计语言构造语法分析程序 [具体要求]对于给定的文法 ...

  3. 对学习编译原理的看法

    我认为编译原理这本书是一门与代码做斗争的课程,学习编译原理能够追寻程序设计语言的本质,了解计算机各种语言编译的原理.学习了编译原理能够更加深入的了解计算机各种高级语言使用的原理,能使自己更加容易更加好 ...

  4. 每天两小时学习编译原理——一个学期的第三天,希望能坚持长久✨

    上一篇:每天两小时学习编译原理--一个学期的第二天,希望能坚持长久✨ 下一篇:每天两小时学习编译原理--一个学期的第四天,希望能坚持长久✨ 继续学习 编译程序过程 词法分析 语法分析 语义分析与中间代 ...

  5. 编译原理实验(三)——LR(0)语法分析

    编译原理实验(三)--LR(0)语法分析 实验要求 参考程序 实验结果 程序输入说明 截图 实验要求 根据LR(0)分析法编写一个语法分析程序 直接输入根据已知文法构造的分析表M;对于输入的文法和符号 ...

  6. 编译原理实验:代码生成作业(1)

    编译原理实验4:中间代码生成实验包-C++文档类资源-CSDN下载编译原理实验4:中间代码生成实验包更多下载资源.学习资料请访问CSDN下载频道.https://download.csdn.net/d ...

  7. html解析器编译原理,编译原理实验报告词法分析器(内含源代码).docx

    编译原理实验报告词法分析器(内含源代码) 编译原理实验(一) --词法分析器 实验描述 运行环境:vc++2008 对某特定语言A ,构造其词法规则. 该语言的单词符号包括: 1该程序能识别的单词符号 ...

  8. 编译原理逆波兰式实验java_逆波兰式算法的编译原理实验过程.doc

    逆波兰式算法的编译原理实验过程 实验目的 深入理解算符优先分析法 掌握FirstVt和LastVt集合的求法有算符优先关系表的求法 掌握利用算符优先分析法完成中缀表达式到逆波兰式的转化 实验内容及要求 ...

  9. 编译实验 lr c语言代码,编译原理-实验5-LR(1)分析法

    <编译原理-实验5-LR(1)分析法>由会员分享,可在线阅读,更多相关<编译原理-实验5-LR(1)分析法(6页珍藏版)>请在人人文库网上搜索. 1.编译原理实验报告项目名称 ...

最新文章

  1. Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
  2. python tk 持续请求接口获取数据_tk数据获得的问题!!
  3. 对c语言和程序设计基础的体会,C语言程序设计基础与应用
  4. phpstudy一直自动停止启动_phpstudy apache启动后停止怎么办?
  5. Python3需要安装的MySQL库是mysqlclient
  6. SLAM: Inverse Depth Parametrization for Monocular SALM
  7. python bool类型return_Python bool()函数可以为无效参数引发异常吗?
  8. UDT源码剖析(三):UDT::startup()过程代码注释
  9. 界面设计--北京创享数码的设计案例(很不错的看看吧)
  10. HDU 6168 Numbers 思维 水题
  11. Hudson dryRun jobs break after upgrade from 2.2.0 to 2.2.1
  12. 第十五讲 循环体for基础
  13. scrapy 在迭代爬取时被拒 offsite 增加dont_filter=True
  14. 如何在 macOS Monterey 中使用空间音频?
  15. linux输入法状态栏消失,隐藏 fcitx 输入法的状态栏
  16. java pdf版本转换_无需依赖第三方软件,在Java中进行PDF格式转换全新攻略
  17. SystemError: could not open configuration file `/etc/libuser.conf': 没有那个文件或目录
  18. 全球及中国中线静脉插管行业研究及十四五规划分析报告
  19. 举例说明 频分多址FDMA、时分多址TDMA、码分多址CDMA、空分多址SDMA的异同
  20. 【备战蓝桥杯】USACo-- airpro【改变策略】

热门文章

  1. JavaScript本地存储详解
  2. Python ElementTree 解析 xml文件
  3. ubuntu下安装mysql数据库
  4. activemq原理 java_分布式消息通信ActiveMQ原理-持久化策略-笔记
  5. 中职计算机优秀主题班会设计方案,30个主题班会设计方案
  6. 使用QQ邮箱修改密码
  7. Linux实战教学笔记14:用户管理初级(上)
  8. css定位属性详解(position属性)
  9. 肖 sir_就业课__006简历讲解
  10. pulse sensor心率传感器