大连工业大学软件学院编译技术课程——MicroC词法分析计算机实验题目编写词法分析与编译程序实验目的:判断循环语句和条件为语句编写词法分析编译器只能通过一次扫描来完成。实验要求:(1)关键字:forifthenelsewhiledountilintinputoutput关键字全部小写。(2)运算符和分隔符::=+-*/<><=<>>=;()#(2)其他标识符(ID)和整数常量(NUM),由以下模式定义:ID=letter(letter|digit)*NUM=digitdigit*(4)Whitespace由空格、制表符和换行符组成.空格一般用于分隔ID、NUM、运算符、分隔符和关键字,在词法分析阶段通常被忽略。各种词法单元对应的词法记号如下:词法单元词法记号词法单元词法记号for1:17if2:=18then3<20else4<>21while5<=22do6>23letter(字母+数字)*10>=24digitdigit*11=25+13;26-14(27*15)28/16#0until29int30input31output32词法分析程序的功能输入:源程序输出:二进制组序列(词法标记,属性值/它在符号表中的位置)。例如:对于源程序intx:=5;如果(x>0)那么x:=2*x+1/3;否则x:=2/x;#词法分析后输出如下序列:(30,int)(10,'x')(18,:=)(11,5)(26,;)(2,if)(27,(...1.几个注意点:(1)初始关键字表Value关键字被当作特殊的标识符,预先安排在一个表中(称为关键字表),当扫描器识别到标识符时,它会查找关键字表。如果可以找到匹配的词,则为一个词的关键字,否则为一般标识符。键表是一个字符串数组,其描述如下:char*keyword[11]={"for","if","then","else","while","do","until",“整数”,“直到”,“输入”,“输出”};(3)程序中需要用到的变量主要有token、id和num。1)id用于存放组成词法单元的字符串;存储整数(可以扩展到浮点数和科学记数法);3)token用于存放词法单元的词法记号。做{词法();//在token中保存词法单元对应的token,在num或id中保存属性值switch(token){case11:printf("(token,%d\n)",num);break;case-1:printf("错误!\n");中断;默认值:printf("(%d,%s)\n",token,id);}while(token!=0);附加问题,我们的密码设置很神奇。要求:(1)必须有字母(大小写),数字,符号,八个以上字符(2)密码每三个月重置一次,新设置的密码不与之前所有密码的字符重复.三次之后,实在无法设置出熟悉的字符串,只好随机创建一个,写在纸上,每次都抄进去。假设旧密码是:by99YL17!使用正则公式检查输入的新密码是否符合规定。机考要求:机考作业需在报到前由助教检查,取得机考成绩。答案第一题importstringresult=""defcheck(temp):globalresultiftempindict_key:result=result+"("+str(dict_key[temp])+","+str(temp)+")"+""else:iflen(temp)==0:result=resulteliftemp[0].isdigit():result=result+"("+"11"+","+temp+")"+""else:result=result+"("+"10"+","+temp+")"+""dict_key={'for':1,'if':2,'then':'3',"else":4,"while":5,"do":6,"letter(letter+digit)*":10,"digitdigit*":11,"until":29,"input":31,":":17,"int":30,"output":32}dict_op={"+":13,"-":14,"*":15,"/":16,">":23,">=":24,"=":25,";":26,"(":27,")":28,"#":0,":=":18,"<":20,"<>":21,"<=":22}withopen("test.txt","r",encoding='UTF-8')asf:data=f.read()temp=""print(data)foriindata:ifiinstring.ascii_letters:temp=temp+i#数字elifi.isdigit():temp=temp+i#空间elifi.isspace():iftemp!="":check(temp)temp=""#characterelse:check(temp)temp=""ifiindict_op:result=result+"("+str(dict_op[i])+","+str(i)+")"+""print(result)第二个问题#Status#Empty:Start#l.小写字母#L.大写字母#c.Symbols#n.Numbers#lL.Lowercase+Uppercase#lc.Lowercase+Symbol#ln.Small+Number#Lc.Symbol+Uppercase#cn.Symbol+Number#Ln.Uppercase+Number#lLc.小写字母+大写字母+符号#lLn小写字母+大写字母+数字#lcn。小写字母+符号+数字#lcn大写字母+符号+数字#lLcn满足条件importreimportstringorigin_pwd="by99YL17!"pwd=input("Enterpassword:")print(pwd)check_err=3status=""iflen(pwd)<9:print("密码太短!!!")else:forchinpwd:if(check_err<0):print("密码和旧密码有3个以上重复数字")break;elifchinorigin_pwd:--check_errelse:ifch.isupper():if"L"notinstatus:status+="L"elifch.islower():if"l"notinstatus:status+="l"elifch.isdigit():如果“n”不在状态中:status+="n"else:如果"c"不在状态中:status+="c"print(status)if"l"instatus和"L"instatusand"n"instatusand"c"instatusandcheck_err>=0:print("满足条件")else:print("不满足条件")python,行!
