TimonSchreiber / InCC

MIT License
1 stars 0 forks source link

Logik zwischen den Parsern #1

Open pcschreiber1 opened 3 months ago

pcschreiber1 commented 3 months ago

@TimonSchreiber Ich versteh nicht ganz, wie die Parser zusammenhängen:

In language/parser/comp_expr.py wird alles von "parser/arit_expr.py" importiert. Nur um die used_procedures_and_classes und yacc zu kriegen? 🤔

#language/parser/comp_expr.py
from .arith_expr import *
from ..lexer.comp_expr import tokens, comp_lexer
import interpreter.all_expr as all_expr

Allgemein ist * import ein "code smell". Lieber nur das importieren, was du brauchst. Wenn du wirklich alles haben willst, dann lieber wie unten, dann ist klar wo die Sachen jeweils herkommen

import arith_expr

arith_expr.used_procedures_and_classes
TimonSchreiber commented 3 months ago

Wichtiger als die yacc und used_procedures_and_classes sind die Funktionen, welche mit p_* beginnen. Wenn ich einen Parser erstelle, braucht dieser immer alle tokens aus den Lexern und, sowie alle Funktionen. Eigentlich müsste ich überhaupt nicht jedesmal einen Parser erstellen, sondern könnte das in der Main Datei machen, aber dann kann ich nicht so einfach wechseln, welchen "Stand" ich testen möchte.

Den tatsächlichen Parser brauche ich im nächsten Schritt, also der nächsten Parser.Datei, nicht.

pcschreiber1 commented 3 months ago

Welches file ist dann das, dass du brauchst? Nur seque_expr?

Wäre dann nicht vielleicht eine Option einen "base_parser" anzulegen, von dem du immer importierst, bzw. dem du die Sachen übergeben kannst?

In dem bräuchtest du dann ja auch gar nicht vom lexer importieren. Allgemein würde ich auch sagen, da du lexer nur im "if name == 'main'" nutzt, sollte er auch nur dort importiert werden. Sprich

if __name__ == '__main__':
# import
from ..lexer.bool_expr import tokens, bool_lexer

  env = {}
  while True:
      i=input("repl > ")
      result = comp_parser.parse(input=i, lexer=comp_lexer)
      print(i,"\n\t",result.eval(env))

Obwohl, ist nicht alles bei dir in den parser files dann nur zum "testen"? Dann sollte das eigentlich alles zusammen unter "if name == 'main'", damit man nicht irgendwas aus dem file importiert. Was meinst du?