Code: Alles auswählen
search_result.found_namelist_item.namelist_item_descript.const_block_idxAußer die Zeile in Variabeln/Membern aufzusplitten, gibt es generell Anregungen wie ich meine Codestrucktur refactoren kann um diesen Effekt zu vermeiden?
Code: Alles auswählen
search_result.found_namelist_item.namelist_item_descript.const_block_idxIn einem gut strukturierten Programmcode hätte man solche Probleme nicht. Da wäre dann das `search_result` eine Liste mit Treffern. Der einzelne Treffer wäre ein NamedTupe oder ein Dictionary, in welchem die Bezeichnung, Detail, Pfad/URL/ID/was-auch-immer abgebildet werden.bennn hat geschrieben:Code: Alles auswählen
search_result.found_namelist_item.namelist_item_descript.const_block_idx
Code: Alles auswählen
ListItemCode: Alles auswählen
ListItemDescriptionCode: Alles auswählen
ListItemDescriptionProcedureCode: Alles auswählen
ListItemDescriptionVarCode: Alles auswählen
ListItemDescriptionConstCode: Alles auswählen
class ListItemDescriptionConst:
pass
class ListItemDescriptionVar:
pass
class ListItemDescriptionProcedure:
pass
class CodeVisitor:
def visit(self, node):
return getattr(self, 'visit_' + type(node).__name__)(node)
def visit_ListItemDescriptionConst(self, node):
print('found ListItemDescriptionConst', node)
def visit_ListItemDescriptionVar(self, node):
print('found ListItemDescriptionVar', node)
def visit_ListItemDescriptionProcedure(self, node):
print('found ListItemDescriptionProcedure', node)
def main():
visitor = CodeVisitor()
visitor.visit(ListItemDescriptionConst())
visitor.visit(ListItemDescriptionVar())
visitor.visit(ListItemDescriptionProcedure())
if __name__ == '__main__':
main()Code: Alles auswählen
found ListItemDescriptionConst <__main__.ListItemDescriptionConst object at 0x7fb8e17a5e48>
found ListItemDescriptionVar <__main__.ListItemDescriptionVar object at 0x7fb8e17a5e48>
found ListItemDescriptionProcedure <__main__.ListItemDescriptionProcedure object at 0x7fb8e17a5e48>Code: Alles auswählen
def visit_ListItemDescriptionProcedure(self, node):
name = node.name
params = self.visit(node.params)
body = self.visit(node.body)
return ...
def visit_ProcedureParams(self, node):
return ...
def visit_ProcedureBody(self, node):
return ...Code: Alles auswählen
import logging
from parser.codegen.CodeGenSearch import SearchIdentResults, SearchResultEnum
import parser.codegen.CodeGeneration
class CodeVisitor:
def __init__(self, generator):
self.generator = generator
def visit(self, search_result: SearchIdentResults):
namelist_item = search_result.get_namelist_item()
return getattr(self, 'visit_' + type(namelist_item.namelist_item_descript).__name__)(search_result)
def visit_NamelistItemDesciptProc(self, search_result: SearchIdentResults):
pass
def visit_NamelistItemDescriptConst(self, search_result: SearchIdentResults):
pass
def visit_NamelistItemDescriptVar(self, search_result: SearchIdentResults):
pass
class CodeVisitorFactorIdent(CodeVisitor):
def visit_NamelistItemDesciptProc(self, search_result: SearchIdentResults):
logging.error('graph factor, semantic check 2: expexted var/const, found proced')
exit(-1)
def visit_NamelistItemDescriptConst(self, search_result: SearchIdentResults):
item = search_result.get_namelist_item()
const_idx = item.namelist_item_descript.const_block_idx
const_idx_endian = self.generator._short_to_little_endian(const_idx)
self.generator.code(parser.codegen.CodeGeneration.VMOperationEnum.puConst, const_idx_endian)
def visit_NamelistItemDesriptVar(self, search_result: SearchIdentResults):
if search_result.search_result_enum is SearchResultEnum.FOUND_GLOBAL:
self.generator._push_val_global_var(search_result)
elif search_result.search_result_enum is SearchResultEnum.FOUND_LOCAL:
rel_var_address = search_result.found_namelist_item.namelist_item_descript.relAdress
rel_var_address_endian = self.generator._short_to_little_endian(rel_var_address)
self.generator.code(parser.codegen.CodeGeneration.VMOperationEnum.puValVrLocl, rel_var_address_endian)
elif search_result.search_result_enum is SearchResultEnum.FOUND_MAIN:
rel_var_address = search_result.found_namelist_item.namelist_item_descript.relAdress
rel_var_address_endian = self.generator._short_to_little_endian(rel_var_address)
self.generator.code(parser.codegen.CodeGeneration.VMOperationEnum.puValVrMain, rel_var_address_endian)
if __name__ == '__main__':
def fac2_ident(self, search_result):
if search_result.search_result_enum is SearchResultEnum.NOT_FOUND:
logging.error('fa2: couldnt find ident ' + ident)
exit(-1)
code_visitor = CodeVisitorFactorIdent(self)
code_visitor.visit(search_result)