Skip to content

Commit 7001c26

Browse files
author
lurenjia
committed
Update
1 parent 3f95231 commit 7001c26

File tree

1 file changed

+34
-59
lines changed

1 file changed

+34
-59
lines changed

seu-lex-yacc/yacc/allcontrol.py

Lines changed: 34 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
['E1', ['T']], # 1 E1->T
2929
['T', ['T', '*', 'F']], # 2 T->T*F
3030
['T', ['F']], # 3 T->F
31-
['F', ['(', 'E1', ')'], ['name']], # 4 F->(E1)|i
31+
['F', ['(', 'E1', ')'], ['name']], # 4 F->(E1)|name
3232
]
3333

3434

@@ -143,79 +143,54 @@ def allControl(input_stack):
143143
move = symbol_in_table + " Shift" # 当前动作为『移进』
144144
pointer += 1 # 读头前进一格
145145

146+
reduce_error = True # 产生式是否有错
147+
146148
# Reduce
147149
if action == 'r':
148150
len_production = len(grammar_rule[number]) # 产生式的长度
149151

150-
if len_production == 2: # 产生式的长度为2,该产生式不带'|'
151-
flag_or = False
152-
else: # 产生式的长度大于2,该产生式带'|'
153-
flag_or = True
154-
155-
# 归约用的产生式不带'|'
156-
if flag_or == False:
157-
production_left = grammar_rule[number][0] # 归约产生式的左部列表
158-
production_right = grammar_rule[number][1] # 归约产生式的右部列表
159-
160-
len_right = len(production_right) # 产生式右部的长度
161-
162-
# 弹出栈顶的 len_right 项
163-
for i in range(len_right):
164-
symbol_stack.pop()
165-
state_stack.pop()
166-
167-
symbol_stack.append(production_left) # 将产生式左部压入符号栈中
168-
169-
temp_current_state = state_stack[-1] # 当前状态为状态栈栈顶元素
152+
# 遍历产生式右部用'|'分割开的部分,寻找适合归约的产生式右部
153+
for i in range(1, len_production):
154+
len_right = len(grammar_rule[number][i]) # 归约产生式第 i 个右部的长度
155+
len_symbol = len(symbol_stack) # 符号栈的长度
170156

171-
# 遇到空白格,报错
172-
if parsing_table[temp_current_state]['GOTO'].has_key(production_left) == False:
173-
print 'error'
174-
break
157+
# 避免数组越界
158+
if len_right > (len_symbol-1):
159+
continue
160+
else:
161+
temp_production_right = ''.join(grammar_rule[number][i]) # 归约产生式第 i 个右部转成字符串
162+
temp_symbol_string = ''.join(symbol_stack[-len_right:]) # 符号栈最后 len_right 个元素转成字符串
175163

176-
next_state = parsing_table[temp_current_state]['GOTO'][production_left] # 下一状态
177-
state_stack.append(next_state) # 将下一状态压入状态栈
164+
if temp_production_right in temp_symbol_string: # 用于归约的产生式右部
165+
reduce_error = False # 产生式没有错误
166+
production_left = grammar_rule[number][0] # 归约产生式的左部列表
167+
production_right = grammar_rule[number][i] # 归约产生式的右部列表
178168

179-
else: # 归约用的产生式带'|'
180-
# 遍历产生式右部用'|'分割开的部分,寻找适合归约的产生式右部
181-
for i in range(1, len_production):
182-
len_right = len(grammar_rule[number][i]) # 归约产生式第 i 个右部的长度
183-
len_symbol = len(symbol_stack) # 符号栈的长度
169+
len_right = len(production_right) # 产生式右部的长度
184170

185-
# 避免数组越界
186-
if len_right > (len_symbol-1):
187-
continue
188-
else:
189-
temp_production_right = ''.join(grammar_rule[number][i]) # 归约产生式第 i 个右部转成字符串
190-
temp_symbol_string = ''.join(symbol_stack[-len_right:]) # 符号栈最后 len_right 个元素转成字符串
171+
# 弹出栈顶的 len_right 项
172+
for j in range(len_right):
173+
symbol_stack.pop()
174+
state_stack.pop()
191175

192-
if temp_production_right in temp_symbol_string: # 用于归约的产生式右部
193-
production_left = grammar_rule[number][0] # 归约产生式的左部列表
194-
production_right = grammar_rule[number][i] # 归约产生式的右部列表
176+
symbol_stack.append(production_left) # 将产生式左部压入符号栈中
177+
temp_current_state = state_stack[-1] # 当前状态为状态栈栈顶元素
195178

196-
len_right = len(production_right) # 产生式右部的长度
197-
198-
# 弹出栈顶的 len_right 项
199-
for j in range(len_right):
200-
symbol_stack.pop()
201-
state_stack.pop()
202-
203-
symbol_stack.append(production_left) # 将产生式左部压入符号栈中
204-
205-
temp_current_state = state_stack[-1] # 当前状态为状态栈栈顶元素
206-
207-
# 遇到空白格,报错
208-
if parsing_table[temp_current_state]['GOTO'].has_key(production_left) == False:
209-
print 'error'
210-
break
179+
# 遇到空白格,报错
180+
if parsing_table[temp_current_state]['GOTO'].has_key(production_left) == False:
181+
print 'error'
182+
break
211183

212-
next_state = parsing_table[temp_current_state]['GOTO'][production_left] # 下一状态
213-
state_stack.append(next_state) # 将下一状态压入状态栈
184+
next_state = parsing_table[temp_current_state]['GOTO'][production_left] # 下一状态
185+
state_stack.append(next_state) # 将下一状态压入状态栈
214186

215-
break
187+
break
216188

217189
move = symbol_in_table + " Reduce" # 当前动作为『归约』
218190

191+
if reduce_error == True:
192+
print "Production "+ str(number) + " error!"
193+
break
219194

220195
if __name__ == "__main__":
221196
# string = input("Enter the input_string: ")

0 commit comments

Comments
 (0)