|
28 | 28 | ['E1', ['T']], # 1 E1->T |
29 | 29 | ['T', ['T', '*', 'F']], # 2 T->T*F |
30 | 30 | ['T', ['F']], # 3 T->F |
31 | | - ['F', ['(', 'E1', ')'], ['name']], # 4 F->(E1)|i |
| 31 | + ['F', ['(', 'E1', ')'], ['name']], # 4 F->(E1)|name |
32 | 32 | ] |
33 | 33 |
|
34 | 34 |
|
@@ -143,79 +143,54 @@ def allControl(input_stack): |
143 | 143 | move = symbol_in_table + " Shift" # 当前动作为『移进』 |
144 | 144 | pointer += 1 # 读头前进一格 |
145 | 145 |
|
| 146 | + reduce_error = True # 产生式是否有错 |
| 147 | + |
146 | 148 | # Reduce |
147 | 149 | if action == 'r': |
148 | 150 | len_production = len(grammar_rule[number]) # 产生式的长度 |
149 | 151 |
|
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) # 符号栈的长度 |
170 | 156 |
|
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 个元素转成字符串 |
175 | 163 |
|
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] # 归约产生式的右部列表 |
178 | 168 |
|
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) # 产生式右部的长度 |
184 | 170 |
|
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() |
191 | 175 |
|
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] # 当前状态为状态栈栈顶元素 |
195 | 178 |
|
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 |
211 | 183 |
|
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) # 将下一状态压入状态栈 |
214 | 186 |
|
215 | | - break |
| 187 | + break |
216 | 188 |
|
217 | 189 | move = symbol_in_table + " Reduce" # 当前动作为『归约』 |
218 | 190 |
|
| 191 | + if reduce_error == True: |
| 192 | + print "Production "+ str(number) + " error!" |
| 193 | + break |
219 | 194 |
|
220 | 195 | if __name__ == "__main__": |
221 | 196 | # string = input("Enter the input_string: ") |
|
0 commit comments