Compiler basteln

  • VB.NET

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von Mangafreak1995.

    Compiler basteln

    Hi,

    ich möchte einen TI BASIC-Compiler für den Computer schreiben. Dazu möchte ich den TI Code in VB.NET umwandeln der dann kompiliert wird. Das Problem hierbei ist das ersetzen von Befehlen die Unterschiedliche Inhalte haben können.

    Beispiel:
    Disp ist sowas wie Console.WriteLine

    Sie kann so aufgerufen werden:
    Disp "Test123"

    man kann dies auch mit der Anzeige einer Variabe verknüpfen
    Disp "Test123", A (A ist ein Variable) sieht dann so aus

    VB.NET-Quellcode

    1. Test123
    2. (Inhalt der Variable A)


    Wie kann ich dieses ersetzen bewerkstelligen?

    8-) faxe1008 8-)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „faxe1008“ ()

    OK habe mir mal die ersten paar Absätze durchgelesen und ich muss sagen, dass ich immernoch keine Idee habe wie ich dass mit dem ersetzen machen kann :S. der Artikle beschäftigt sich überwiegend mir dem theoretischen Aufbau. Hat jemand noch eine Konkrete Idee?

    Nur um einfache Programme zu schreiben nicht so was kompliziertes wie mein aktuellstes Werk (für Mathe), aber hier das Programm damit ihr euch mal ein Überblick über den Syntax verschaffen könnt (dass das mit den Funktionen nur mit einem Parser geht ist mir klar):
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Input "FUNKTION:",Str1
    2. Str1 -> Y2
    3. Input "ABL. FUNKTION:", Str1
    4. Str1 -> Y1
    5. For (G,-10,10,0.8)
    6. G -> O
    7. For (L,1,10
    8. O-(Y1(O)/nDeriv(Y1,X,O)) -> O 'Annährungverfahren nach Newton für die Nullstelle der ersten Ableitung
    9. End
    10. Y1(O-0,002) -> Y
    11. Y1(O+0,002) -> Z
    12. If Y>0 and Z<0
    13. Then
    14. Disp "Maximum",O,Y1(O)
    15. End
    16. If Y<0 and Z>0
    17. Then
    18. Disp "Minimum",O,Y1(O)
    19. End
    20. End

    8-) faxe1008 8-)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „faxe1008“ ()

    faxe1008 schrieb:

    ich möchte einen TI BASIC-Compiler für den Computer schreiben.
    Wer programmiert mit TI BASIC? :S
    Oder ist das einfach eine Programmier-Übung für Dich? :thumbsup:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany:
    Mit TI-Basic programmiert jeder der sich in Mathe den Rechenweg verkürzen kann/will :D :whistling: . (TI-BASIC ist die Scriptsprache des Texasinstrument Taschenrechners). Und ja es ist auch eine Programmierübung, wobei eigentlich jedes Projekt "Übung" ist :D .

    Hat noch jemand eine Idee wie das mit der Ersetzung geht?

    8-) faxe1008 8-)
    OK.
    Ich würde die Keywords mit einem Dictionary(Of, String, String) übersetzen.
    Für die Syntax sollte bei Bedarf auch eine äquivalente Übertragung angegangen werden, aber dazu brauchst Du zunächst ein paar umfangreiche Testcodes.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany:
    Wenn mich nicht alles täuscht dann sitzt da ein Komma falsch Dim translator As New Dictionary(Of String, String) so zeigt es richtig an.

    Wie kann ich das Dictonary als Übersetzer verwenden ? Muss ich alle Zeilen der Richtextbox durchgehen und prüfen ob sie z.B. Disp enthalten und das dann durch Console.WriteLine ersetzen?

    Achja und hier einen kleinen Einblick in die Syntax: WIKI

    8-) faxe1008 8-)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „faxe1008“ ()

    faxe1008 schrieb:

    dann sitzt da ein Komma falsch
    Korrekt.
    Hier ein Crashkurs:

    VB.NET-Quellcode

    1. Dim dct As New Dictionary(Of String, String)
    2. dct.Add("a", "111")
    3. dct.Add("b", "222")
    4. dct.Add("c", "333")
    5. dct.Add("d", "444")
    6. MessageBox.Show(dct("a"))
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Wie kann ich das Dictonary durchgehen und jeweils ersetzen?

    Ich habs so gelöst ist jedoch nicht optimal... :S

    VB.NET-Quellcode

    1. Dim TI_List As New List(Of String)
    2. Dim VB_NET As New List(Of String)
    3. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    4. For u = 0 To TI_List.Count - 1
    5. RichTextBox1.Text = RichTextBox1.Text.Replace(TI_List.Item(u), VB_NET.Item(u))
    6. Next
    7. End Sub
    8. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    9. TI_List.Add("Disp")
    10. VB_NET.Add("Console.WriteLine")
    11. End Sub


    Wie kann ich den Syntax vereinheitlichen?
    Disp "Blabla",B -> Console.WriteLine("Blabla" & vbcrlf & B.tostring)

    Ich fange allmählich an an der Syntax Sache zu verzweifeln ;( .

    8-) faxe1008 8-)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „faxe1008“ ()

    faxe1008 schrieb:

    Wie kann ich das Dictonary durchgehen und jeweils ersetzen?
    Dictonary kommt in Deinem Code nicht vor. ;(
    Sieh Dir den Code in Post #8 an, kopiee ihn in ein kleies Testprogramm und erlerne, was da passiert.
    Klick mal auf Dictonary und drück auf F1, da öffnet sich die MSDN.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ok hab mich mal noch mit Dictonary beschäftigt. Hab auch eins angelegt für die wichtigsten Befehle. Wie kann ich jetzt die syntax "übersetzen" die ja teilweise optionale Parameter verwendet?

    1.RegEx ?
    2. Bastelei mit Replace substring etc. ?

    @Mods: Sorry, dass ich das wieder ausgrabe :S

    EDIT:\\\ @ RegEx Pros:
    Habe jetzt wieder das Reg-Tut angesehen jedoch steht eine Sache nicht drin:
    Welchen Pattern kann man verwenden um einen String beliebiger Länge zwischen zwei " zu suchen?

    8-) faxe1008 8-)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „faxe1008“ ()

    Nach jedem Regex Tutorial das du gelesen hast weißt du wie das geht. Natürlich steht nicht explicit drinnen wie man zwischen zwei "" liest. Genauso wenig steht drinnen wie man zwischen den beiden Wörtern "Wurst" und "Brot" den Text findet.
    Ich kenne TI-Basic zu wenig aber ich würde mir da nen anständigen Parser basteln was natürlich etwas länger geht, dafür aber auch hinhaut.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Hab ich ja gerade auch vor. TI-Basic ist eine etwas angepasste Version von Basic (grob gesagt). Jup bei RegEx ist viel rumexperimentieren / Wissen gefragt wie mir scheint.

    EDIT:\\\ Hab jetzt ein wenig rumgebastelt und mit dem RegEx-Tester ausprobiert und habs hingekriegt! Danke an alle die Geduld mit mir hatten, ihr seid Spitze :thumbsup: .

    8-) faxe1008 8-)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „faxe1008“ ()

    Eine Frage hätte ich jedoch:
    Wie kann ich Struktur-Befehle übersetzen? Das Problem hierbei in Basic gibt es kein End If und auch kein Next sondern nur End. Wie kann ich nun mit RegEx wissen ob das End der Abschluss einer Forschleife oder eines If-Baumes ist?

    P.S: @Mods: Sorry für den Doppelpost :S

    8-) faxe1008 8-)

    faxe1008 schrieb:

    Wie kann ich nun mit RegEx wissen ob das End der Abschluss einer Forschleife oder eines If-Baumes ist?
    Das ist gefährlich.
    Ich würde RegEx da wohl eher nicht verwenden, denn wenn Du einen Befehl mit REM auskommentierst, bekommt RegEx davon nix mit.
    Du solltest Dir vielleicht einen Syntax-Parser bauen, der zu einem Eröffnungscode den kommunizierenden Schlusscode findet, unabhängig davon, was dazwischen steht.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Ich würde RegEx da wohl eher nicht verwenden


    aber es ist doch so praktisch ;( (vorallendingen jetzt wo ichs mir halbwegs angeignet habe), denn für die Basis-Befehle Disp, Input, Prompt, und ClrHome funktioniert das ausgezeichnet!

    RodFromGermany schrieb:

    Du solltest Dir vielleicht einen Syntax-Parser bauen, der zu einem Eröffnungscode den kommunizierenden Schlusscode findet, unabhängig davon, was dazwischen steht.


    Gerne wenn ich wüsste wie. Wenn nicht mit RegEx dann mit den umständlichen Methoden Substring, Insert, IndexOf etc. oder ?

    8-) faxe1008 8-)

    faxe1008 schrieb:

    Gerne wenn ich wüsste wie.
    Ja, das ist umständlich.
    Schreib Dir einfach mal eine Formel hin und überlege Dir, wie Du zu einer öffnenden eine schließende Klammer findest.
    Mit dem End zum If ist das genau so.
    Wenn unterwegs ein For auftaucht, weißt Du, dass Du zuerst dessen End finden musst, um danach das End zum If zu haben.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Oder wenn ich nicht so sehr darauf beharre könnte ich es auch so machen:

    Quellcode

    1. For(u,1,10,1
    2. [bla]
    3. Next

    statt End zu übernehmen könnte man das Next ja auch stehen lassen oder?

    ->

    VB.NET-Quellcode

    1. For u = 1 to 10 Step 1
    2. [bla]
    3. Next

    = das könnte man nun kompilieren.

    Ich weiß dass das dann nur ein Provisorium ist aber es würde funktionieren, bis ich eine Alternative habe.

    8-) faxe1008 8-)
    Dazu kenn ich die TI-Syntax nicht gut genug, mein Vater hatte mal so ein Ding.
    Du musst auch ineinander geschachtelte Schleifen sauber auflösen können, das wollte ich eigentlich zum Ausdruck bringen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Wenn du möchtest, kann ich dir helfen :). Ich programmiere schon länger mit dem TI BASIC und hab auch schonmal nen Umwandler von ner eigenen Skriptsprache zu VB.NET gemacht, hab da also auch schon ein bisschen Erfahrung.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „nafets3646“ ()