Hydrogen-python/semantic/rule.py
2025-06-12 00:05:54 +08:00

1561 lines
46 KiB
Python

from semantic.symbol import *
from error import SemanticError
from semantic.code import get_temp_block_name, get_temp_var_name
"""
添加语义规则的文法
0. program{code} ->{.init} define-list
1. define-list{code} -> define define-list
{code} | empty
2. define{code} -> type ID define-type{type id}
3. define-type{code .enter} ->{.judge} var-define-follow{type id}
{code} |{.judge} fun-define-follow{type fun}
4. var-define-follow{type} -> ;
{type length} | [ NUM ] ;
5. type ->{type} int
|{type} void
6. fun-define-follow{code} -> ( params{type fun} ) code-block{fun}
7. params{.create} -> param-list{fun}
{.create} | empty
8. param-list -> param{fun} param-follow{fun}
9. param-follow -> , param{fun} param-follow{fun}
| empty
10. param -> type ID array-subscript
11. array-subscript{type} -> [ ]
{type} | empty
12. code-block{code} -> { local-define-list{fun} code-list{fun} }
13. local-define-list -> local-var-define{fun} local-define-list{fun}
| empty
14. local-var-define -> type ID var-define-follow
15. code-list{code} -> code{fun} code-list{fun}
| empty
16. code{code} -> normal-statement{fun}
| selection-statement{fun}
| iteration-statement{fun}
| return-statement{fun}
17. normal-statement -> ;
| ID normal-statement-follow{fun id}
18. normal-statement-follow{code} -> var-follow{fun} = expression{fun} ;
{code} | call-follow{fun id} ;
19. call-follow{code} -> ( call-params{fun id} )
20. call-params{code} -> call-param-list{fun}
| empty
21. call-param-list{num code} -> expression{fun} call-param-follow{fun}
22. call-param-follow{num code names} -> , expression{fun} call-param-follow{fun}
| empty
23. selection-statement{code} -> if ( expression{fun} ) { code-list{fun} } selection-follow{fun}
24. selection-follow{code} -> else { code-list{fun} }
{code} | empty
25. iteration-statement -> while ( expression{fun} ) iteration-follow{fun}
26. iteration-follow{code} -> { code-list{fun} }
{code} | code{fun}
27. return-statement{code} -> return return-follow{fun}
28. return-follow -> ;
| expression{fun} ;
29. var-follow{code name type} -> [ expression{fun} ]
{type} | empty
30. expression{code name bool} -> additive-expr{fun} expression-follow{fun}
31. expression-follow{bool code op name} -> rel-op additive-expr{fun}
{bool} | empty
32. rel-op{op} -> <=
| <
| >
| >=
| ==
| !=
33. additive-expr{name code} -> term{fun} additive-expr-follow{fun}
34. additive-expr-follow{add op code name} -> add-op term{fun} additive-expr-follow{fun}
{add} | empty
35. add-op{op} -> +
| -
36. term{name code} -> factor{fun} term-follow{fun}
37. term-follow{mul op code name} -> mul-op factor{fun} term-follow{fun}
{mul} | empty
38. mul-op{op} -> *
| /
| %
39. factor{name code} -> ( expression{fun} )
| ID id-factor-follow{id fun}
| NUM
40. id-factor-follow -> var-follow{fun}
| ( args{fun} )
41. args{code num} -> arg-list{fun}
| empty
42. arg-list{code num} -> expression{fun} arg-list-follow{fun}
43. arg-list-follow{code num names} -> , expression{fun} arg-list-follow{fun}
| empty
"""
# 定义一个符号表池,每次调用函数的时候使用深拷贝从这里取局部变量表
symbol_table_pool = SymbolTablePool()
class SemanticRule:
"""
语义规则
"""
def __init__(self, node):
"""
构造
:param node: 树节点
"""
self.node = node
self.errors = list()
def __rule(self, node):
"""
实际的语义规则,需要复写
:param node:
"""
return []
def execute(self):
"""
执行语义规则
"""
self.__rule(self.node)
def have_no_errors(self):
"""
是否没有错误
:return: 是否没有错误
"""
return len(self.errors) == 0
class SemanticRuleFactory:
"""
语义规则工厂,根据给出的 rule_key 返回相应的实例
"""
@classmethod
def get_instance(cls, rule_key, node):
"""
获取语义规则实例
:param rule_key: 关键字
:param node: 目标节点
:return: 实例
"""
# 0
if rule_key == 'Program0S':
return Program0S(node)
if rule_key == 'Program0E':
return Program0E(node)
# 1
if rule_key == 'DefineLists1E':
return DefineLists1E(node)
# 2
if rule_key == 'DefineLists2E':
return DefineLists2E(node)
# 3
if rule_key == 'DefineList3E':
return DefineList3E(node)
# 4
if rule_key == 'DefineList4E':
return DefineList4E(node)
# 5
if rule_key == 'FunDefine5C3':
return FunDefine5C3(node)
if rule_key == 'FunDefine5C5':
return FunDefine5C5(node)
if rule_key == 'FunDefine5C7':
return FunDefine5C7(node)
if rule_key == 'FunDefine5E':
return FunDefine5E(node)
# 6
if rule_key == 'Params6S':
return Params6S(node)
# 7
if rule_key == 'Params7S':
return Params7S(node)
if rule_key == 'Params7C0':
return Params7C0(node)
# 8
if rule_key == 'ParamList8C0':
return ParamList8C0(node)
if rule_key == 'ParamList8C1':
return ParamList8C1(node)
# 9
if rule_key == 'ParamFollow9C1':
return ParamFollow9C1(node)
if rule_key == 'ParamFollow9C2':
return ParamFollow9C2(node)
# 11
if rule_key == 'Param11E':
return Param11E(node)
# 12
if rule_key == 'ArrayList12S':
return ArrayList12S(node)
# 13
if rule_key == 'ArrayList13S':
return ArrayList13S(node)
# 14
if rule_key == 'FunReturn14S':
return FunReturn14S(node)
# 15
if rule_key == 'FunReturn15E':
return FunReturn15E(node)
# 16
if rule_key == 'Type16S':
return Type16S(node)
# 17
if rule_key == 'Type17S':
return Type17S(node)
# 18
if rule_key == 'Type18S':
return Type18S(node)
# 19
if rule_key == 'GlobalVarDefine19C3':
return GlobalVarDefine19C3(node)
if rule_key == 'GlobalVarDefine19E':
return GlobalVarDefine19E(node)
# 20
if rule_key == 'GlobalVarDefineFllow20E':
return GlobalVarDefineFllow20E(node)
if rule_key == 'GlobalVarDefineFllow20C2':
return GlobalVarDefineFllow20C2(node)
# 22
if rule_key == 'CodeBlock22C0':
return CodeBlock22C0(node)
if rule_key == 'CodeBlock22E':
return CodeBlock22E(node)
# 23
if rule_key == 'CodeList23C0':
return CodeList23C0(node)
if rule_key == 'CodeList23C1':
return CodeList23C1(node)
if rule_key == 'CodeList23E':
return CodeList23E(node)
# 24
if rule_key == 'CodeList24E':
return CodeList24E(node)
# 25
if rule_key == 'Code25C0':
return Code25C0(node)
if rule_key == 'Code25E':
return Code25E(node)
# 26
if rule_key == 'Code26C0':
return Code26C0(node)
if rule_key == 'Code26E':
return Code26E(node)
# 27
if rule_key == 'Code27C0':
return Code27C0(node)
if rule_key == 'Code27E':
return Code27E(node)
# 28
if rule_key == 'Code28C0':
return Code28C0(node)
if rule_key == 'Code28C0':
return Code28C0(node)
# 29
if rule_key == 'Code29C0':
return Code29C0(node)
if rule_key == 'Code29C0':
return Code29C0(node)
# 30
if rule_key == 'LocalDefine30C0':
return LocalDefine30C0(node)
if rule_key == 'LocalDefine30C1':
return LocalDefine30C1(node)
if rule_key == 'LocalDefine30C2':
return LocalDefine30C2(node)
if rule_key == 'LocalDefine30C3':
return LocalDefine30C3(node)
if rule_key == 'LocalDefine30E':
return LocalDefine30E(node)
# 31
if rule_key == 'LocalDefineFollow31C1':
return LocalDefineFollow31C1(node)
if rule_key == 'LocalDefineFollow31C2':
return LocalDefineFollow31C2(node)
if rule_key == 'LocalDefineFollow31E':
return LocalDefineFollow31E(node)
# 52
if rule_key == 'Exp52C0':
return Exp52C0(node)
if rule_key == 'Exp52C1':
return Exp52C1(node)
if rule_key == 'Exp52E':
return Exp52E(node)
# 53
if rule_key == 'ExpFollow53C1':
return ExpFollow53C1(node)
if rule_key == 'ExpFollow53E':
return ExpFollow53E(node)
# 54
if rule_key == 'ExpFollow54E':
return ExpFollow54E(node)
# 55
if rule_key == 'RelOp55E':
return RelOp55E(node)
# 56
if rule_key == 'RelOp56E':
return RelOp56E(node)
# 57
if rule_key == 'RelOp57E':
return RelOp57E(node)
# 58
if rule_key == 'RelOp58E':
return RelOp58E(node)
# 59
if rule_key == 'RelOp59E':
return RelOp59E(node)
# 60
if rule_key == 'RelOp60E':
return RelOp60E(node)
# 61
if rule_key == 'AdditiveExpr61C0':
return AdditiveExpr61C0(node)
if rule_key == 'AdditiveExpr61C1':
return AdditiveExpr61C1(node)
if rule_key == 'AdditiveExpr61E':
return AdditiveExpr61E(node)
# 62
if rule_key == 'AdditiveExprFollow62C1':
return AdditiveExprFollow62C1(node)
if rule_key == 'AdditiveExprFollow62C2':
return AdditiveExprFollow62C2(node)
if rule_key == 'AdditiveExprFollow62E':
return AdditiveExprFollow62E(node)
# 63
if rule_key == 'AdditiveExprFollow63E':
return AdditiveExprFollow63E(node)
# 64
if rule_key == 'AddOp64E':
return AddOp64E(node)
# 65
if rule_key == 'AddOp65E':
return AddOp65E(node)
# 66
if rule_key == 'Term66C0':
return Term66C0(node)
if rule_key == 'Term66C1':
return Term66C1(node)
if rule_key == 'Term66E':
return Term66E(node)
# 67
if rule_key == 'TermFollow67C1':
return TermFollow67C1(node)
if rule_key == 'TermFollow67C2':
return TermFollow67C2(node)
if rule_key == 'TermFollow67E':
return TermFollow67E(node)
# 68
if rule_key == 'TermFollow68E':
return TermFollow68E(node)
# 69
if rule_key == 'MulOp69E':
return MulOp69E(node)
# 70
if rule_key == 'MulOp70E':
return MulOp70E(node)
# 71
if rule_key == 'Factor71C1':
return Factor71C1(node)
if rule_key == 'Factor71E':
return Factor71E(node)
# 72
if rule_key == 'Factor72C1':
return Factor72C1(node)
if rule_key == 'Factor72E':
return Factor72E(node)
# 73
if rule_key == 'Factor73E':
return Factor73E(node)
# 74
if rule_key == 'IdFactorFollow74E':
return IdFactorFollow74E(node)
# 75
if rule_key == 'IdFactorFollow75C1':
return IdFactorFollow75C1(node)
if rule_key == 'IdFactorFollow75E':
return IdFactorFollow75E(node)
# 76
if rule_key == 'Args76C0':
return Args76C0(node)
if rule_key == 'Args76E':
return Args76E(node)
# 77
if rule_key == 'Args77E':
return Args77E(node)
# 78
if rule_key == 'ArgList78C0':
return ArgList78C0(node)
if rule_key == 'ArgList78C1':
return ArgList78C1(node)
if rule_key == 'ArgList78E':
return ArgList78E(node)
# 79
if rule_key == 'ArgListFollow79C1':
return ArgListFollow79C1(node)
if rule_key == 'ArgListFollow79C2':
return ArgListFollow79C2(node)
if rule_key == 'ArgListFollow79E':
return ArgListFollow79E(node)
# 80
if rule_key == 'ArgListFollow80E':
return ArgListFollow80E(node)
# 81
if rule_key == 'ArrayListWithNum81E':
return ArrayListWithNum81E(node)
# 82
if rule_key == 'ArrayListWithNum82E':
return ArrayListWithNum82E(node)
return None
# S 产生式开始
# E 产生式结束
# CN 产生式第N个元素应用之后
# 0
class Program0S(SemanticRule):
def __rule(self, node):
symbol_table_pool.init()
def execute(self):
self.__rule(self.node)
class Program0E(SemanticRule):
def __rule(self, node):
for c in node.children[0].code:
node.code.append(c)
symbol_table_pool.debug()
def execute(self):
self.__rule(self.node)
# 1
class DefineLists1E(SemanticRule):
def __rule(self, node):
for c in node.children[0].code:
node.code.append(c)
for c in node.children[1].code:
node.code.append(c)
def execute(self):
self.__rule(self.node)
# 2
class DefineLists2E(SemanticRule):
def __rule(self, node):
node.code.clear()
def execute(self):
self.__rule(self.node)
# 3
class DefineList3E(SemanticRule):
def __rule(self, node):
for c in node.children[0].code:
node.code.append(c)
def execute(self):
self.__rule(self.node)
# 4
class DefineList4E(SemanticRule):
def __rule(self, node):
for c in node.children[0].code:
node.code.append(c)
def execute(self):
self.__rule(self.node)
# 5
class FunDefine5C3(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.parent.id = node.get_pre_brother(2).lexical
if symbol_table_pool.fun_table.exist(node.parent.id):
self.errors.append(SemanticError('函数名' + node.id + '重定义'))
node.fun = node.parent.id
class FunDefine5C5(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.fun = node.parent.id
class FunDefine5C7(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.fun = node.get_pre_brother(6).lexical
class FunDefine5E(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
for c in node.children[3].code:
node.code.append(c)
for c in node.children[7].code:
node.code.append(c)
node.type = node.children[7].type
class Params6S(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
symbol_table_pool.append(
LocalVarTable(node.fun, symbol_table_pool.global_var_table)
)
symbol_table_pool.fun_table.append(
Fun(node.fun, None, symbol_table_pool.query(node.fun))
)
class Params7S(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
symbol_table_pool.append(
LocalVarTable(node.fun, symbol_table_pool.global_var_table)
)
symbol_table_pool.fun_table.append(
Fun(node.fun, None, symbol_table_pool.query(node.fun))
)
class Params7C0(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.fun = node.parent.fun
class ParamList8C0(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.fun = node.parent.fun
class ParamList8C1(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.fun = node.parent.fun
class ParamFollow9C1(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.fun = node.parent.fun
class ParamFollow9C2(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.fun = node.parent.fun
class Param11E(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
if node.children[2].type == 'void':
self.errors.append(SemanticError('参数' + node.children[0].lexical + '不能定义为void类型'))
if node.children[2].type == 'i32':
if symbol_table_pool.query(node.fun).exist(node.children[0].lexical):
self.errors.append(SemanticError('参数' + node.children[0].lexical + '重定义'))
else:
if node.children[3].type == 'array':
symbol_table_pool.query(node.fun).append(
LocalVar(node.children[0].lexical, 'address', 4, True)
)
if node.children[3].type == 'var':
symbol_table_pool.query(node.fun).append(
LocalVar(node.children[0].lexical, 'i32', 4, True)
)
if node.children[2].type == 'f32':
if symbol_table_pool.query(node.fun).exist(node.children[0].lexical):
self.errors.append(SemanticError('参数' + node.children[1].lexical + '重定义'))
else:
if node.children[3].type == 'array':
symbol_table_pool.query(node.fun).append(
LocalVar(node.children[0].lexical, 'address', 4, True)
)
if node.children[3].type == 'var':
symbol_table_pool.query(node.fun).append(
LocalVar(node.children[0].lexical, 'f32', 4, True)
)
class ArrayList12S(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.type = 'var'
class ArrayList13S(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.type = 'array'
class FunReturn14S(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.type = 'void'
if not symbol_table_pool.change_fun_type(node.fun, node.type):
self.errors.append(SemanticError('函数' + node.fun + '没有定义'))
class FunReturn15E(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
if node.children[1].type == 'void' and node.children[2].type =='var':
if not symbol_table_pool.change_fun_type(node.fun, 'void'):
self.errors.append(SemanticError('函数' + node.fun + '没有定义'))
if node.children[1].type == 'void' and node.children[2].type =='array':
if not symbol_table_pool.change_fun_type(node.fun, 'void[]'):
self.errors.append(SemanticError('函数' + node.fun + '没有定义'))
if node.children[1].type == 'i32':
if node.children[2].type == 'array':
if not symbol_table_pool.change_fun_type(node.fun, 'i32[]'):
self.errors.append(SemanticError('函数' + node.fun + '没有定义'))
if node.children[2].type == 'var':
if not symbol_table_pool.change_fun_type(node.fun, 'i32'):
self.errors.append(SemanticError('函数' + node.fun + '没有定义'))
if node.children[1].type == 'f32':
if node.children[2].type == 'array':
if not symbol_table_pool.change_fun_type(node.fun, 'f32[]'):
self.errors.append(SemanticError('函数' + node.fun + '没有定义'))
if node.children[2].type == 'var':
if not symbol_table_pool.change_fun_type(node.fun, 'f32'):
self.errors.append(SemanticError('函数' + node.fun + '没有定义'))
class Type16S(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.type = 'i32'
class Type17S(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.type = 'f32'
class Type18S(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.type = 'void'
class GlobalVarDefine19C3(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.type = None
node.length = 0
node.array = None
if node.get_pre_brother(3).type == 'void' and node.get_pre_brother(2).type =='var':
self.errors.append(SemanticError('变量' + node.id + '不能定义为void类型'))
if node.get_pre_brother(3).type == 'void' and node.get_pre_brother(2).type =='array':
self.errors.append(SemanticError('变量' + node.id + '不能定义为void[]类型'))
if node.get_pre_brother(3).type == 'i32':
if node.get_pre_brother(2).type == 'array':
node.type = 'i32[]'
node.length = node.get_pre_brother(2).length
node.array = True
if node.get_pre_brother(2).type == 'var':
node.type = 'i32'
node.array = False
if node.get_pre_brother(3).type == 'f32':
if node.get_pre_brother(2).type == 'array':
node.type = 'f32[]'
node.array = True
node.length = node.get_pre_brother(2).length
if node.get_pre_brother(2).type == 'var':
node.type = 'f32'
node.array = False
if node.type == None:
self.errors.append(SemanticError('变量' + node.get_pre_brother(1).lexical + '声明类型不支持'))
class ArrayListWithNum82E(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.type = 'array'
node.length = node.children[1].lexical
class ArrayListWithNum81E(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.type = 'var'
class GlobalVarDefine19E(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.id = node.children[2].lexical
if symbol_table_pool.global_var_table.exist(node.id):
self.errors.append(SemanticError('变量' + node.id + '重定义'))
node.type = None
node.length = 0
if node.children[0].type == 'void' and node.children[1].type =='var':
self.errors.append(SemanticError('变量' + node.id + '不能定义为void类型'))
if node.children[0].type == 'void' and node.children[1].type =='array':
self.errors.append(SemanticError('变量' + node.id + '不能定义为void[]类型'))
if node.children[0].type == 'i32':
if node.children[1].type == 'array':
node.type = 'i32[]'
node.length = int(node.children[1].length)
symbol_table_pool.global_var_table.append(
GlobalVar(node.id, 'i32[]', 4 * node.length)
)
if node.children[1].type == 'var':
node.type = 'i32'
symbol_table_pool.global_var_table.append(
GlobalVar(node.id, 'i32', 4)
)
if node.children[0].type == 'f32':
if node.children[1].type == 'array':
node.type = 'f32[]'
node.length = int(node.children[1].length)
symbol_table_pool.global_var_table.append(
GlobalVar(node.id, 'f32[]', 4 * node.length)
)
if node.children[1].type == 'var':
node.type = 'f32'
symbol_table_pool.global_var_table.append(
GlobalVar(node.id, 'f32', 4)
)
if node.type == None:
self.errors.append(SemanticError('变量' + node.get_pre_brother(1).lexical + '声明类型不支持'))
class GlobalVarDefineFllow20C2(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.type = node.parent.type
node.length = node.parent.length
node.array = node.parent.array
class GlobalVarDefineFllow20E(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.id = node.children[1].lexical
if symbol_table_pool.global_var_table.exist(node.id):
self.errors.append(SemanticError('变量' + node.id + '重定义'))
symbol_table_pool.global_var_table.append(
GlobalVar(node.id, node.type, 4 * int(node.length))
)
class CodeBlock22C0(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.fun = node.parent.fun
class CodeBlock22E(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.code.append("(fun, _, _, " + node.fun + ")")
for c in node.children[0].code:
node.code.append(c)
class CodeList23C0(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.fun = node.parent.fun
class CodeList23C1(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.fun = node.parent.fun
class CodeList23E(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
for c in node.children[0].code:
node.code.append(c)
for c in node.children[1].code:
node.code.append(c)
class CodeList24E(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.code.clear()
class Code25C0(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.fun = node.parent.fun
class Code25E(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
for c in node.children[0].code:
node.code.append(c)
class Code26C0(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.fun = node.parent.fun
class Code26E(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
for c in node.children[0].code:
node.code.append(c)
class Code27C0(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.fun = node.parent.fun
class Code27E(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
for c in node.children[0].code:
node.code.append(c)
class Code28C0(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.fun = node.parent.fun
class Code28E(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
for c in node.children[0].code:
node.code.append(c)
class Code29C0(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.fun = node.parent.fun
class Code29E(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
for c in node.children[0].code:
node.code.append(c)
class LocalDefine30C0(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.fun = node.parent.fun
class LocalDefine30C1(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.fun = node.parent.fun
class LocalDefine30C2(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.fun = node.parent.fun
class LocalDefine30C3(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.type = None
node.length = 0
node.array = None
if node.get_pre_brother(3).type == 'void' and node.get_pre_brother(2).type =='var':
self.errors.append(SemanticError('变量' + node.id + '不能定义为void类型'))
if node.get_pre_brother(3).type == 'void' and node.get_pre_brother(2).type =='array':
self.errors.append(SemanticError('变量' + node.id + '不能定义为void[]类型'))
if node.get_pre_brother(3).type == 'i32':
if node.get_pre_brother(2).type == 'array':
node.type = 'i32[]'
node.length = node.get_pre_brother(2).length
node.array = True
if node.get_pre_brother(2).type == 'var':
node.type = 'i32'
node.array = False
if node.get_pre_brother(3).type == 'f32':
if node.get_pre_brother(2).type == 'array':
node.type = 'f32[]'
node.array = True
node.length = node.get_pre_brother(2).length
if node.get_pre_brother(2).type == 'var':
node.type = 'f32'
node.array = False
if node.type == None:
self.errors.append(SemanticError('变量' + node.get_pre_brother(1).lexical + '声明类型不支持'))
class LocalDefine30E(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.id = node.children[2].lexical
if symbol_table_pool.query(node.fun).exist(node.id):
self.errors.append(SemanticError('变量' + node.id + '重定义'))
node.type = None
node.length = 0
if node.children[0].type == 'void' and node.children[1].type =='var':
self.errors.append(SemanticError('变量' + node.id + '不能定义为void类型'))
if node.children[0].type == 'void' and node.children[1].type =='array':
self.errors.append(SemanticError('变量' + node.id + '不能定义为void[]类型'))
if node.children[0].type == 'i32':
if node.children[1].type == 'array':
node.type = 'i32[]'
node.length = int(node.children[1].length)
symbol_table_pool.query(node.fun).append(
LocalVar(node.id, 'i32[]', 4 * node.length, False)
)
if node.children[1].type == 'var':
node.type = 'i32'
symbol_table_pool.query(node.fun).append(
LocalVar(node.id, 'i32', 4, False)
)
if node.children[0].type == 'f32':
if node.children[1].type == 'array':
node.type = 'f32[]'
node.length = int(node.children[1].length)
symbol_table_pool.query(node.fun).append(
LocalVar(node.id, 'f32[]', 4 * node.length, False)
)
if node.children[1].type == 'var':
node.type = 'f32'
symbol_table_pool.query(node.fun).append(
LocalVar(node.id, 'f32', 4, False)
)
if node.type == None:
self.errors.append(SemanticError('变量' + node.get_pre_brother(1).lexical + '声明类型不支持'))
class LocalDefineFollow31C1(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.fun = node.parent.fun
class LocalDefineFollow31C2(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.fun = node.parent.fun
node.type = node.parent.type
node.length = node.parent.length
class LocalDefineFollow31E(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.id = node.children[1].lexical
if symbol_table_pool.global_var_table.exist(node.id):
self.errors.append(SemanticError('变量' + node.id + '重定义'))
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:
name_1 = get_temp_var_name()
node.name = 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 + " ," + name_1 + ")")
# (=. i1, _, o1)
node.code.append("(=, " + name_1 + ", _," + node.name + ")")
else:
node.name = node.children[0].name
for c in node.children[0].code:
node.code.append(c)
class ExpFollow53C1(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.fun = node.parent.fun
class ExpFollow53E(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.bool = True
node.op = node.children[0].op
node.name = node.children[1].name
for c in node.children[1].code:
node.code.append(c)
class ExpFollow54E(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.bool = False
class RelOp55E(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.op = node.children[0].lexical
class RelOp56E(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.op = node.children[0].lexical
class RelOp57E(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.op = node.children[0].lexical
class RelOp58E(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.op = node.children[0].lexical
class RelOp59E(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.op = node.children[0].lexical
class RelOp60E(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.op = node.children[0].lexical
class AdditiveExpr61C0(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.fun = node.parent.fun
class AdditiveExpr61C1(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.fun = node.parent.fun
class AdditiveExpr61E(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
if node.children[1].add:
name_1 = get_temp_var_name()
node.name = 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, in1, in2, o1)
node.code.append("(" + node.children[1].op + ", " + node.children[0].name + ", " + node.children[1].name + ", " + name_1 + ")")
# (=, in1, _, o1)
node.code.append("(=, " + name_1, + ", _, " + node.name + ")")
else:
node.name = node.children[0].name
for c in node.children[0].code:
node.code.append(c)
class AdditiveExprFollow62C1(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.fun = node.parent.fun
class AdditiveExprFollow62C2(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.fun = node.parent.fun
class AdditiveExprFollow62E(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.add = True
node.op = node.children[0].op
if node.children[2].add:
node.name = get_temp_var_name()
name_1 = get_temp_var_name()
for c in node.children[1].code:
node.code.append(c)
for c in node.children[2].code:
node.code.append(c)
# (op, in1, in2, o1)
node.code.append("(" + node.children[1].op + ", " + node.children[0].name + ", " + node.children[1].name + ", " + name_1 + ")")
# (=, in1, _, o1)
node.code.append("(=, " + name_1, + ", _, " + node.name + ")")
else:
node.name = node.children[1].name
for c in node.children[1].code:
node.code.append(c)
class AdditiveExprFollow63E(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.add = False;
class AddOp64E(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.op = node.children[0].lexical
class AddOp65E(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.op = node.children[0].lexical
class Term66C0(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.fun = node.parent.fun
class Term66C1(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.fun = node.parent.fun
class Term66E(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
if node.children[1].mul:
name_1 = get_temp_var_name()
node.name = 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, in1, in2, o1)
node.code.append("(" + node.children[1].op + ", " + node.children[0].name + ", " + node.children[1].name + ", " + name_1 + ")")
# (=, in1, _, o1)
node.code.append("(=, " + name_1, + ", _, " + node.name + ")")
else:
node.name = node.children[0].name
for c in node.children[0].code:
node.code.append(c)
class TermFollow67C1(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.fun = node.parent.fun
class TermFollow67C2(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.fun = node.parent.fun
class TermFollow67E(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.mul = True
node.op = node.children[0].op
if node.children[2].mul:
node.name = get_temp_var_name()
name_1 = get_temp_var_name()
for c in node.children[1].code:
node.code.append(c)
for c in node.children[2].code:
node.code.append(c)
# (op, in1, in2, o1)
node.code.append("(" + node.children[1].op + ", " + node.children[0].name + ", " + node.children[1].name + ", " + name_1 + ")")
# (=, in1, _, o1)
node.code.append("(=, " + name_1, + ", _, " + node.name + ")")
else:
node.name = node.children[1].name
for c in node.children[1].code:
node.code.append(c)
class TermFollow68E(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.mul = False;
class MulOp69E(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.op = node.children[0].lexical
class MulOp70E(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.op = node.children[0].lexical
class Factor71C1(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.fun = node.parent.fun
class Factor71E(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
for c in node.children[1].code:
node.code.append(c)
node.name = node.children[1].name
class Factor72C1(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.id = node.get_pre_brother(1).lexical
node.fun = node.parent.fun
class Factor72E(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
for c in node.children[1].code:
node.code.append(c)
node.name = node.children[1].name
class Factor73E(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.name = get_temp_var_name
node.code.append("(=, " + node.children[0].lexical, +", _, ", node.name)
class IdFactorFollow74E(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
if symbol_table_pool.query(node.fun).exist(node.id):
if node.children[0].type == "var":
node.name = node.id
if node.children[0].type == "array":
node.name = get_temp_var_name()
for c in node.children[0].code:
node.code.append(c)
node.code.append("(=[], " + node.id, + ", " + node.children[0].name + ", " + node.name)
else:
self.errors.append('变量' + node.id + '未定义')
class IdFactorFollow75C1(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.fun = node.parent.fun
class IdFactorFollow75E(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
if symbol_table_pool.fun_table.exist(node.id):
if node.children[1].num != symbol_table_pool.query(node.id).get_params_num():
self.errors.append('调用函数' + node.id + ', 参数数量不匹配')
else:
for c in node.children[1].code:
node.code.append(c)
node.code.append('(call' + ', ' + node.id + ', ' + str(symbol_table_pool.query(node.id).get_params_num()) + ", _)")
node.name = get_temp_var_name()
node.code.append('(=, result, _, ' + node.name + ')')
else:
self.errors.append('函数' + node.id + '未定义')
class Args76C0(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.fun = node.parent.fun
class Args76E(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
for c in node.children[0].code:
node.code.append(c)
node.num = node.children[0].num
class Args77E(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.code.clear()
node.num = 0
class ArgList78C0(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.fun = node.parent.fun
class ArgList78C1(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.fun = node.parent.fun
class ArgList78E(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.num = 1 + node.children[1].num
for c in node.children[0].code:
node.code.append(c)
for c in node.children[1].code:
node.code.append(c)
node.code.append("(param, _, _, )" + node.children[0].name)
for name in node.children[1].names:
node.code.append("(param, _, _, )" + name)
class ArgListFollow79C1(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.fun = node.parent.fun
class ArgListFollow79C2(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.fun = node.parent.fun
class ArgListFollow79E(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.num = 1 + node.children[2].num
for c in node.children[1].code:
node.code.append(c)
for c in node.children[2].code:
node.code.append(c)
node.names.append(node.children[1].name)
for name in node.children[2].names:
node.names.append(name)
class ArgListFollow80E(SemanticRule):
def execute(self):
self.__rule(self.node)
def __rule(self, node):
node.num = 0
node.code.clear()
node.names.clear()