diff --git a/semantic/rule.py b/semantic/rule.py index b42ef42..938aa3d 100644 --- a/semantic/rule.py +++ b/semantic/rule.py @@ -931,5 +931,41 @@ class LocalDefineFollow31E(SemanticRule): symbol_table_pool.global_var_table.append( GlobalVar(node.id, node.type, 4 * int(node.length)) ) + +class Exp52C0(SemanticRule): + def execute(self): + self.__rule(self.node) + + def __rule(self, node): + self.fun = node.parent.fun + +class Exp52C1(SemanticRule): + def execute(self): + self.__rule(self.node) + + def __rule(self, node): + self.fun = node.parent.fun + +class Exp52E(SemanticRule): + def execute(self): + self.__rule(self.node) + + def __rule(self, node): + node.bool = node.children[1].bool + if node.children[1].bool: + node.name_1 = get_temp_var_name() + node.name_2 = get_temp_var_name() + for c in node.children[0].code: + node.code.append(c) + for c in node.children[1].code: + node.code.append(c) + # (op, i1, i2, o1) + node.code.append("(" + node.children[1].op + " ,", + node.children[0].name + " ," + node.children[1].name + " ," + node.name_1 + ")") + # (=. i1, _, o1) + node.code.append("(=, " + node.name_1 + ", _," + node.name_2 + ")") + else: + node.name = node.children[0].name + for c in node.children[0].code: + node.code.append(c) diff --git a/syntax/rule.py b/syntax/rule.py index 87220af..cbacad1 100644 --- a/syntax/rule.py +++ b/syntax/rule.py @@ -555,7 +555,7 @@ productions = [ # ), # 52 Production('exp', ['additive-expr', 'exp-follow'], - None, ['exp0C0', 'exp0C1'], 'exp0E'), + None, ['Exp52C0', 'Exp52C1'], 'Exp52E'), # # 53 # Production('exp-follow', ['rel-op', 'additive-expr'], # None, [None, 'expFollow0C1'], 'expFollow0E'),