DDP-Projekt / Kompilierer

Der Kompilierer der Deutschen Programmiersprache
https://ddp.le0n.dev/Spielplatz
MIT License
139 stars 3 forks source link

Crash mit öffentlicher Kombination #42

Closed bafto closed 11 months ago

bafto commented 11 months ago
Unerwarteter Fehler: CompilerError(Mod: D:\Hendrik\source\OtherLanguages\DDPRepos\AoC23\05b.ddp, Node: ImportStmt, Range: Range{Start: Pos{L: 7 C: 1} End: Pos{L: 7 C: 17}}): unknown compiler panic
Wraps: runtime error: invalid memory address or nil pointer dereference
StackTrace:
goroutine 1 [running]:
runtime/debug.Stack()
        C:/Users/Hendrik/Go/src/runtime/debug/stack.go:24 +0x5e
github.com/DDP-Projekt/Kompilierer/src/compiler.compiler_panic_wrapper(0xc00007cb40)
        D:/Hendrik/source/OtherLanguages/GoRepos/DDP-Projekt/Kompilierer/src/compiler/error.go:38 +0x54
panic({0x7ff7e8020ba0?, 0x7ff7e7fb7630?})
        C:/Users/Hendrik/Go/src/runtime/panic.go:914 +0x21f
github.com/DDP-Projekt/Kompilierer/src/compiler.(*compiler).toIrType(0xc00007cb40, {0x7ff7e8155008?, 0xc0002b8270?})
        D:/Hendrik/source/OtherLanguages/GoRepos/DDP-Projekt/Kompilierer/src/compiler/helper.go:64 +0x1a8
github.com/DDP-Projekt/Kompilierer/src/compiler.(*compiler).toIrParamType(0xc00007cb40?, {{0x7ff7e8155008?, 0xc0002b8270?}, 0x13?})
        D:/Hendrik/source/OtherLanguages/GoRepos/DDP-Projekt/Kompilierer/src/compiler/helper.go:90 +0x25
github.com/DDP-Projekt/Kompilierer/src/compiler.(*compiler).VisitImportStmt.func1({0xc00005a000?, 0xc00015cc28?}, {0x7ff7e815a408?, 0xc0001f1a00?}, {0x8, {0xc00000a670, 0x5}, 0x0, {{0x7, 0x7}, ...}, ...})
        D:/Hendrik/source/OtherLanguages/GoRepos/DDP-Projekt/Kompilierer/src/compiler/compiler.go:1550 +0x685
github.com/DDP-Projekt/Kompilierer/src/ast.IterateImportedDecls(0xc0001efef0, 0xc00015cd78)
        D:/Hendrik/source/OtherLanguages/GoRepos/DDP-Projekt/Kompilierer/src/ast/helper.go:46 +0x293
github.com/DDP-Projekt/Kompilierer/src/compiler.(*compiler).VisitImportStmt(0xc00007cb40, 0xc0001efef0)
        D:/Hendrik/source/OtherLanguages/GoRepos/DDP-Projekt/Kompilierer/src/compiler/compiler.go:1528 +0x7d
github.com/DDP-Projekt/Kompilierer/src/ast.(*ImportStmt).Accept(0x0?, {0x7ff7e815c418?, 0xc00007cb40?})
        D:/Hendrik/source/OtherLanguages/GoRepos/DDP-Projekt/Kompilierer/src/ast/ast.go:582 +0x27
github.com/DDP-Projekt/Kompilierer/src/compiler.(*compiler).visitNode(...)
        D:/Hendrik/source/OtherLanguages/GoRepos/DDP-Projekt/Kompilierer/src/compiler/compiler.go:256
github.com/DDP-Projekt/Kompilierer/src/compiler.(*compiler).compile(0xc00007cb40, {0x7ff7e8153c00, 0xc000316180}, 0x1)
        D:/Hendrik/source/OtherLanguages/GoRepos/DDP-Projekt/Kompilierer/src/compiler/compiler.go:171 +0x58f
github.com/DDP-Projekt/Kompilierer/src/compiler.compileWithImportsRec(0xc000074370, 0xc00015d6e8, 0xc00005a000?, 0xc00003e000?, 0xbe?, 0xc00003cc80)
        D:/Hendrik/source/OtherLanguages/GoRepos/DDP-Projekt/Kompilierer/src/compiler/compiler.go:60 +0x69d
github.com/DDP-Projekt/Kompilierer/src/compiler.compileWithImports(0x7ff7e80b29dd?, 0x7?, 0x0?)
        D:/Hendrik/source/OtherLanguages/GoRepos/DDP-Projekt/Kompilierer/src/compiler/compiler.go:32 +0x93
github.com/DDP-Projekt/Kompilierer/src/compiler.Compile({{0xc00000a0f0, 0x7}, {0xc0000d0000, 0x2a5, 0x2a6}, {0x0, 0x0}, {0x7ff7e8153960, 0xc000064068}, 0x3, ...})        
        D:/Hendrik/source/OtherLanguages/GoRepos/DDP-Projekt/Kompilierer/src/compiler/interface.go:198 +0x596
main.(*BuildCommand).Run(0xc0000aa540)
        D:/Hendrik/source/OtherLanguages/GoRepos/DDP-Projekt/Kompilierer/cmd/kddp/build_cmd.go:175 +0x858
main.(*RunCommand).Run(0x7ff7e8f55660)
        D:/Hendrik/source/OtherLanguages/GoRepos/DDP-Projekt/Kompilierer/cmd/kddp/run_cmd.go:75 +0x492
main.runCommands()
        D:/Hendrik/source/OtherLanguages/GoRepos/DDP-Projekt/Kompilierer/cmd/kddp/main.go:38 +0x13d
main.main()
        D:/Hendrik/source/OtherLanguages/GoRepos/DDP-Projekt/Kompilierer/cmd/kddp/main.go:14 +0x34

Dieser Fehler ist vermutlich ein Bug im DDP-Kompilierer.
Bitte erstelle einen Issue unter https://github.com/DDP-Projekt/Kompilierer oder melde ihn anderweitig den Entwicklern.

05a.ddp:

Binde "Duden/Eingabe" ein.
Binde "Duden/Listen" ein.
Binde "Duden/Texte" ein.
Binde "Duden/Zeichen" ein.
Binde "Duden/Ausgabe" ein.
Binde "Duden/Zahlen" ein.

Wir nennen die öffentliche Kombination aus
    der öffentlichen Zahl ziel_start mit Standardwert 0,
    der öffentlichen Zahl quell_start mit Standardwert 0,
    der öffentlichen Zahl bereich_länge mit Standardwert 0,
eine Umwandlung,
und erstellen sie so:
    "einer Umwandlung mit Ziel <ziel_start> Quelle <quell_start> und Länge <bereich_länge>"

[überspringt 1 Zeile und fängt dann das parsen an]
Die öffentliche Funktion Parse_Umwandlungen gibt eine Umwandlung Liste zurück, macht:
    Die nächste Zeile. [überspringt 1 Zeile]

    Die Umwandlung Liste umwandlungen ist eine leere Umwandlung Liste.
    Der Text zeile ist die nächste Zeile.
    Solange zeile ungleich "" ist, mache:
        Die Text Liste wörter ist zeile an ' ' gespalten.
        Speichere umwandlungen verkettet mit einer Umwandlung 
            mit Ziel ((wörter an der Stelle 1) als Zahl) 
            Quelle ((wörter an der Stelle 2) als Zahl)  
            und Länge ((wörter an der Stelle 3) als Zahl)
        in umwandlungen.
        Wenn die Benutzereingabe zu Ende gewesen ist, gib umwandlungen zurück.
        Speichere die nächste Zeile in zeile.

    Gib umwandlungen zurück.
Und kann so benutzt werden:
    "die nächsten Umwandlungen"

Die öffentliche Funktion Gewandelter_Wert mit den Parametern Wert und Umwandlungen vom Typ Zahl und Umwandlung Listen Referenz, gibt eine Zahl zurück, macht:
    Für jede Umwandlung u in Umwandlungen, mache:
        Wenn Wert zwischen (quell_start von u) minus 1 und (quell_start von u plus bereich_länge von u) plus 1 ist, dann:
            Gib ziel_start von u plus Wert minus quell_start von u zurück.
    Gib Wert zurück.
Und kann so benutzt werden:
    "die Umwandlung <Umwandlungen> von <Wert>" oder 
    "der Umwandlung <Umwandlungen> von <Wert>"

Die öffentliche Text Liste samen_zeile ist (die nächste Zeile) an ' ' gespalten.
Die Zahlen Liste samen ist die Länge von samen_zeile minus 1 Mal 0.
Für jede Zahl i von 2 bis die Länge von samen_zeile, speichere (samen_zeile an der Stelle i) als Zahl in samen an der Stelle (i minus 1).

Die nächste Zeile. [überspringt 1 Zeile]

Die Umwandlung Liste samen_boden ist die nächsten Umwandlungen.
Die Umwandlung Liste boden_dünger ist die nächsten Umwandlungen.
Die Umwandlung Liste dünger_wasser ist die nächsten Umwandlungen.
Die Umwandlung Liste wasser_licht ist die nächsten Umwandlungen.
Die Umwandlung Liste licht_temperatur ist die nächsten Umwandlungen.
Die Umwandlung Liste temperatur_feuchtigkeit ist die nächsten Umwandlungen.
Die Umwandlung Liste feuchtigkeit_ort ist die nächsten Umwandlungen.

Die öffentliche Funktion Samen_zu_Ort mit dem Parameter samen vom Typ Zahl, gibt eine Zahl zurück, macht:
    Gib die Umwandlung feuchtigkeit_ort von (
        der Umwandlung temperatur_feuchtigkeit von (
            der Umwandlung licht_temperatur von (
                der Umwandlung wasser_licht von (
                    der Umwandlung dünger_wasser von (
                        der Umwandlung boden_dünger von (
                            der Umwandlung samen_boden von samen
                            )
                        )
                    )
                )
            )
        )
    zurück.
Und kann so benutzt werden:
    "der Ort für <samen>"

Die Zahl kleinster_ort ist der maximale Wert einer Zahl.
Für jede Zahl samen in samen, mache:
    Die Zahl ort ist der Ort für samen.
    Wenn ort kleiner als kleinster_ort ist, dann:
        Speichere ort in kleinster_ort.

Schreibe kleinster_ort auf eine Zeile.

05b.ddp:

Binde "Duden/Eingabe" ein.
Binde "Duden/Listen" ein.
Binde "Duden/Texte" ein.
Binde "Duden/Zeichen" ein.
Binde "Duden/Ausgabe" ein.
Binde "Duden/Zahlen" ein.
Binde "05a" ein.

Die Zahl kleinster_ort ist der maximale Wert einer Zahl.

Für jede Zahl i von 2 bis die Länge von samen_zeile mit Schrittgröße 2, mache:
    Die Zahl start ist (samen_zeile an der Stelle i) als Zahl.
    Die Zahl ende ist start plus (samen_zeile an der Stelle i) als Zahl.
    Für jede Zahl samen von start bis ende, mache:
        Die Zahl ort ist der Ort für samen.
        Wenn ort kleiner als kleinster_ort ist, dann:
            Speichere ort in kleinster_ort.

Schreibe kleinster_ort auf eine Zeile.
bafto commented 11 months ago

fixed in 3c9849d