Parser - Anfang ist getan wie weiter machen?

  • VB.NET

Es gibt 22 Antworten in diesem Thema. Der letzte Beitrag () ist von faxe1008.

    @Artentus Eine Sache wäre noch zu klären:

    Spoiler anzeigen
    1. Das Token ist 2, also eine Zahl, und kommt direkt zur Ausgabe.
    Ausgabe: 2
    Operatorstack: Leer

    2. Das Token ist +, ein Operator. Da der Operatorstack leer ist müssen keine zusätzlichen Aktionen getätigt werden, der Token kommt direkt auf den Stack.
    Ausgabe: 2
    Operatorstack: +

    3. Die Zahl 18 kommt wieder zur Ausgabe.
    Ausgabe: 2 18
    Operatorstack: +

    4. Ein Operator, und diesmal ist der Stack ist nicht leer. Die Präzedenz des obersten Operators auf dem Stack (+) ist aber niedriger als die von /, deswegen werden wieder keine zusätzlichen Aktionen ausgeführt.
    Ausgabe: 2 18
    Operatorstack: + /

    5. Zahl kommt auf den Stack.
    Ausgabe: 2 18 3
    Operatorstack: + /

    6. Der oberste Operator auf dem Stack, Division, wir höher priorisiert als der aktuelle Operator Subtraktion und wird deswegen zur Ausgabe geschoben.
    Ausgabe: 2 18 3 /
    Operatorstack: +
    Jetzt liegt der Additionsoperator auf dem Stack. Dieser hat die selbe Präzedenz wie Subtraktion, ist jedoch linksassoziativ und wird deswegen auch zur Ausgabe verschoben.
    Ausgabe: 2 18 3 / +
    Operatorstack: Leer
    Nun muss der aktuelle Operator noch auf den Stack.
    Ausgabe: 2 18 3 / +
    Operatorstack: -

    7. Noch eine Zahl, die auf die Ausgabe kommt.
    Ausgabe: 2 18 3 / + 7
    Operatorstack: -

    8. Es befinden sich keine Tokens mehr in der Eingabeliste, wir leeren also als letze Handlung den Operatorstack vollständig in die Ausgabe.
    Ausgabe: 2 18 3 / + 7 -


    Warum werden bei Schritt 6 zwei Operator auf einmal aus dem Stack in den Output gepackt? Da der letzte Token noch nicht erreicht wurde kann es sich ja nicht um den Rest-Flush handeln. Was ist der Auslöser dafür?

    8-) faxe1008 8-)
    Achso 8| das macht dann mehr Sinn. Danke :thumbup:

    Ja so läuft das butterweich :thumbsup: :

    VB.NET-Quellcode

    1. Public Function ShuntingYardBasic(inputList As List(Of String)) As List(Of String)
    2. Dim outputList As New List(Of String)
    3. Dim operatorStack As New Stack(Of String)
    4. For Each token As String In inputList
    5. If IsNumeric(token) Then
    6. outputList.Add(token)
    7. End If
    8. If operatorStack.Count = 0 AndAlso IsNumeric(token) = False Then
    9. operatorStack.Push(token)
    10. Continue For
    11. End If
    12. If operatorStack.Count > 0 AndAlso IsNumeric(token) = False Then
    13. While operatorStack.Count > 0 AndAlso olderIsHigher(operatorStack.Peek, token)
    14. outputList.Add(operatorStack.Pop)
    15. End While
    16. operatorStack.Push(token)
    17. End If
    18. Next
    19. While operatorStack.Count > 0
    20. outputList.Add(operatorStack.Pop)
    21. End While
    22. Return outputList
    23. End Function


    8-) faxe1008 8-)