编译原理词法分析python_编译原理实验:实验一 简单词法分析程序设计(必修)(Python实现)...

1 importre2 """5个做统计的全局变量"""

3 int_num =04 char_num =05 string_num =06 float_num =07 bool_num =08 """用来去掉正则时产生的 中括号 以及 分号 '"""

9 defmyReplace(s):10 s = s.replace('[\'','')11 s = s.replace('\']','')12 s = s.replace('[','')13 s = s.replace(']','')14 returns15 """判断是否是bool型常量"""

16 defIsBool(s,currn):17 s = s + ' '

18 globalbool_num19 bool_error = re.findall(r'= *([a-z]+ +[^ ]+)',s,0)#优先匹配错误情况,比如 x = true hdfkjg(中间空格分开的字符)

20 if(bool_error):21 returnFalse22 bool_T = re.findall(r'= *(true)',s,0)#匹配true情况

23 if(bool_T):24 print(currn+'(bool,'+bool_T[0]+')')25 bool_num = bool_num + 1

26 returnTrue27 bool_F = re.findall(r'= *(false)',s,0)#匹配false情况

28 if(bool_F):29 print(currn + '(bool,' + bool_F[0] + ')')30 bool_num = bool_num + 1

31 returnTrue32

33 """判断是否是字符串常量"""

34 defIsStrings(s,currn):35 globalstring_num36 String = (re.findall('=[\ ]*([\“|\"][^\“\"]*[\”|\"])[\ |,|;]*',s,0))37 for strings inString:38 strings =str(strings)39 if(strings):40 print(currn+'(string,'+strings+')')41 string_num = string_num + 1

42 returnTrue43 else:44 returnFalse45 """判断是否是字符常量"""

46 defIsChar(s,currn):47 Char = re.findall('=\ *([\‘|\'][^\'\‘\’]+[\’|\'])',s,0)48 globalchar_num49 for C inChar:50 C =str(C)51 if(C):52 if(len(C)==3):53 print(currn+'(char,'+C+')')54 char_num = char_num + 1

55 else:56 print(currn+'(Wrong! There are more than one char in ‘’.)')57 returnTrue58 else:59 returnFalse60

61 """判断是否是浮点数常量"""

62 defIsFloat(s,currn):63 s = s + ' '

64 globalfloat_num65 Float_first = re.findall(r'= *([+|-]?0?.[0-9]+)',s,0)#匹配整数部分为0或者没有的情况的情况

66 if(Float_first):67 print(currn+'(float,'+Float_first[0]+')')68 float_num = float_num + 1

69 returnTrue70 Float_0 = re.findall(r'= *([+|-]?0[0-9]+.[0-9]+)',s,0)#匹配整数部分以0开始的错误情况

71 if(Float_0):72 print(currn + '(Wrong! The float can’t be started with ‘0’.)')73 returnFalse74 Float_E = re.findall(r'= *([+|-]?[1-9].[0-9]+[E|e]-[1-9][0-9]*)',s,0)#匹配正确的实型科学计数法,未考虑错误情况

75 if(Float_E):76 print(currn + '(float,' + Float_E[0]+ ')')77 float_num = float_num + 1

78 returnTrue79 Float = str(re.findall(r'\=[\ ]*([+|-]?[0-9]*\.[0-9]+)',s,0))80 Float =myReplace(Float)81 if(Float):82 print(currn+'(float,'+Float+')')83 float_num = float_num + 1

84 returnTrue85 else:86 returnFalse87

88 """判断是否是整形常量"""

89 defIsInt(s,currn):90 s = s + ' '

91 globalint_num92 Int_E = re.findall(r'= *([+|-]?[1-9].[0-9]+[E|e][+][1-9][0-9]*)',s,0)#匹配整型为科学计数法的情况,未考虑错误情况

93 if(Int_E):94 print(currn + '(integer,' + Int_E[0] + ')')95 int_num = int_num + 1

96 returnTrue97 Int_first = re.findall(r'= *([0])',s,0)#匹配数值为0的情况

98 if(Int_first):99 int_num = int_num + 1

100 print(currn + '(integer,' + '0' + ')')101 returnTrue102 Int_0 = re.findall(r'= *([+|-]?0[0-9]*)',s,0)#匹配数值以0开头的情况(已去掉单个0情况)

103 if(Int_0):104 print(currn + '(Wrong! The integer can’t be started with ‘0’.)')105 returnFalse106 Int = (str)(re.findall(r'= *([+|-]?[1-9][0-9]*)',s,0))107 Int =myReplace(Int)108 if(Int):109 print(currn+'(integer,'+Int+')')110 int_num = int_num + 1

111 returnTrue112 else:113 returnFalse114 """判断变量名是否合法"""

115 defpd(s):116 bian = str(re.findall(r'*([A-Za-z0-9_]*) *=',s,0))117 bian =myReplace(bian)118 if(bian and (not(bian[0]>='0'and bian[0]<='9'))):119 returnbian120 else:121 print(bian+'(Wrong! It is not aidentifier!)')122 return '0error'

123 """获得const关键字"""

124 defgetcon(s):125 fir = re.findall('[\ ]*(const)\', s, 0)126 if(len(fir) == 1):127 returnfir128 else:129 return 'None'

130 """获得变量的类型"""

131 defgetType(s):132 fir = (re.findall(r'[ |,|,|]+?(.*?[^,;]+)[,|;]*?',s,0))#将输入正确的串按照 ,(逗号) 或者 ;(分号)分开,/

133 #操作后的fir就是一个个变量定义的集合 例如 [x = 1, y=2.2]

134 for men infir:135 currn = pd(str(men))#判断变量名是否合法,并取出合法的变量名,如果变量名不合法,currn='0error'

136 if(currn=='0error'):137 continue

138 else:139 if(IsBool(men,currn)):140 continue

141 if(IsStrings(men,currn)):142 continue

143 if(IsChar(men,currn)):144 continue

145 if(IsFloat(men,currn)):146 continue

147 if(IsInt(men,currn)):148 continue

149

150 """Main 函数入口"""

151 if __name__ == '__main__':152 while(True):153 bool_num = int_num = float_num = char_num = string_num =0154 st =input()155 fir = getcon(st)#获得const标识符

156 if(fir!='None'):157 getType(st)158 print("int_num=%d; char_num=%d; string_num=%d; float_num=%d; bool_num=%d."%(int_num,char_num,string_num,float_num,bool_num))159 else:160 print('It is not a constant declaration statement!')161 print('Please input a string again!')162

163

164 """

const count=10,sum=81.5,char1=‘f’,max=169,str1=“h*54 2..4S!AAsj”, char2=‘@’,str2=“aa!+h”;

count(float,10)

sum(float,81.5)

char1(char, ‘f’)

max(float,169)

str1(string,“h*54 2..4S!AAsj”)

char2(char, ‘@’)

str2(string,“aa!+h”)

int_num=0; char_num=2; string_num=2; float_num=3; bool_num=0.

Aconstt count=10,sum=81.5,char1=‘f’;

It is not a constant declaration statement!

Please input a string again!

const count=10,12sum=81.5,char1=‘ff’,max=0016;

count(float,10)

12sum(Wrong! It is not aidentifier!)

char1(Wrong! There are more than one char in ‘’.)

max(float,0016)

int_num=0; char_num=0; string_num=0; float_num=2; bool_num=0.

const dx = 1.27e+7,de = 1.27e-21,dd=89.7,fdg=678.6.7.6,4554, rtrtryt=.9898,gfgffggf=8.45,rt = +11.23,rr = -0.01,ry=-00.11;

dx(integer,1.27e+7)

de(float,1.27e-21)

dd(float,89.7)

(Wrong! It is not aidentifier!)

rtrtryt(float,.9898)

gfgffggf(float,8.45)

rt(float,+11.23)

rr(float,-0.01)

ry(Wrong! The float can’t be started with ‘0’.)

int_num=1; char_num=0; string_num=0; float_num=6; bool_num=0.

const x = 1,y=2.2,z='u',u="hdfjksah",dd=true,dt=false,ry=true ,ri= false , zx = true ui,mr = false dslk;

x(float, 1)

y(float,2.2)

z(char, 'u')

u(string,"hdfjksah")

dd(bool,true)

dt(bool,false)

ry(bool,true)

ri(bool,false)

int_num=0; char_num=1; string_num=1; float_num=2; bool_num=4.

const x = 1,y=2.2,z=‘u’,u="hdfjksah";

It is not a constant declaration statement!

Please input a string again!

x(float, 1)

y(float,2.2)

z(char, ‘u’)

u(string,"hdfjksah")

int_num=0; char_num=1; string_num=1; float_num=2; bool_num=0.

"""

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值