=len(lis):
40 break
41 if lis[i][0] in operator_priority_tuple[pri]:
42 if module_dic_tuple[pri][lis[i][0]](lis,i)==0:
43 i=0
44 continue
45 else:
46 i=i+1
47 continue
48 else:
49 i=i+1
50 for pri in range(12,13): # pri 12 # parse ...A A:A...
51 i=0
52 while 1:
53 if len(lis)==1 and lis[0][0][0]=='@':
54 return 0
55 if i>=len(lis):
56 break
57 if lis[i][0]==':':
58 if module_dic_tuple[pri][' :'](lis,i)==0:
59 i=0
60 continue
61 else:
62 i=i+1
63 continue
64 else:
65 i=i+1
66 return module_dic_tuple[13][','](lis,0)
67 return 1
复制代码
上面代码中,使用了函数引用的词典链表来简化此部分的代码数量。
这一部分就不进行验证展示了,具体过程与前面的文章《一个简单的语义分析算法:单步算法——
Python实现》中的描述类似。
实现了 parse_simple_expr 功能之后,剩下的函数与括号的语义分析变得简单些,演算过程如下:
代码实现:
复制代码
1 ########### return value :[intStatusCode,indexOf'(',indexOf')']
2 ############# intStatusCode
3 ############# 0 sucessfully
4 ############# 1 no parenthesis matched
5 ############# 2 list is null :(
6 def module_parenthesis_place(lis):
7 length=len(lis)
8 err=0
9 x=0
10 y=0
11 if length==0:
12 return [2,None,None]
13 try:
14 x=lis.index([")",None])
15 except:
16 err=1
17 lis.reverse()
18 try:
19 y=lis.index(["(",None],length-x-1)
20 except:
21 err=1
22 lis.reverse()
23 y=length-y-1
24 if err==1:
25 return [1,None,None]
26 else:
27 return [0,y,x]
28
29
30 ############################# parse:unary binary ternary prenthesis function expr
31 ########### return value :
32 ############# 0 parsed sucessfully
33 ############# 1 syntax error
34 ############################# find first ')'
35 def parse_comp_expr(lis):
36 while 1:
37 if len(lis)==0:
38 return 1
39 if len(lis)==1:
40 if lis[0][0][0]=='@':
41 return 0
42 else:
43 return 1
44 place=module_parenthesis_place(lis)
45 if place[0]==0:
46 mirror=lis[(place[1]+1):place[2]]
47 if parse_simple_expr(mirror)==0:
48 if place[1]>=1 and lis[place[1]-1][0]=='@var':
49 '''func'''
50 funcName=lis[place[1]-1][1]
51 del lis[place[1]-1:(place[2]+1)]
52 lis.insert(place[1]-1,["@func",funcName,mirror[0]])
53 else:
54 del lis[place[1]:(place[2]+1)]
55 lis.insert(place[1],mirror[0])
56 else:
57 return 1
58 else:
59 return parse_simple_expr(lis)
60 return 1
复制代码
如此,代码到此结束。
下面给出实验结果:
复制代码
>>> ls=[['(',None],['@var','f'],['(',None],['@num','1'],[',',None],['@num','2'],[',',None],['@num','3'],[',',None],['!',None],['-',None],['@var','x'],[' ',None],['@var','y'],[':',None],['~',None],['@var','z'],[')',None],['-',None],['@num','3'],[')',None],['/',None],['@num','4']]
>>> ls
[['(', None], ['@var', 'f'], ['(', Non