Hi,
Ich möchte gerade meinen Parser in Java umschreiben um ihn auch dort nutzen zu können. Soweit funktioniert auch alles bis auf eine Schleife:
Verhält sich vollkommen unterschiedlich, allerdings ist das doch das selbe, oder?
Wenn jemand der Meinung ist, dass es am Rest des Algos liegt der kann auch mal einen Blick darauf werfen:
Vielen Dank für eure Hilfe
Ich möchte gerade meinen Parser in Java umschreiben um ihn auch dort nutzen zu können. Soweit funktioniert auch alles bis auf eine Schleife:
Verhält sich vollkommen unterschiedlich, allerdings ist das doch das selbe, oder?
Wenn jemand der Meinung ist, dass es am Rest des Algos liegt der kann auch mal einen Blick darauf werfen:
VB.NET-Quellcode
- Private Function ShuntingYard(ByVal tokens As List(Of Token)) As List(Of Token)
- Dim outputList As New List(Of Token)
- Dim operatorStack As New Stack(Of Token)
- For Each tk As Token In token
- If tk.Type = TokenType.Number Then
- outputList.Add(tk)
- Continue For
- End If
- If tk.Type = TokenType.Function OrElse tk.Content = "(" Then
- operatorStack.Push(tk)
- Continue For
- End If
- If tk.Content = ")" Then
- Do Until operatorStack.Peek.Type = TokenType.Function OrElse operatorStack.Peek.Content = "(" OrElse operatorStack.Count = 0
- outputList.Add(operatorStack.Pop)
- Loop
- If operatorStack.Peek.Content <> "(" Then
- outputList.Add(operatorStack.Pop)
- Else
- operatorStack.Pop()
- End If
- Continue For
- End If
- If tk.Type = TokenType.Operator AndAlso operatorStack.Count = 0 Then
- operatorStack.Push(tk)
- Continue For
- End If
- If operatorStack.Count > 0 AndAlso tk.Type = TokenType.Operator Then
- While operatorStack.Count > 0 AndAlso tk.EvaluatesBefore(operatorStack.Peek) AndAlso operatorStack.Peek.Content <> "(" AndAlso operatorStack.Peek.Type <> TokenType.Function
- outputList.Add(operatorStack.Pop)
- End While
- operatorStack.Push(tk)
- End If
- Next
- While operatorStack.Count > 0
- outputList.Add(operatorStack.Pop)
- End While
- Return outputList
- End Function
Java-Quellcode
- public static ArrayList<Token> ShuntingYard(ArrayList<Token> tokens){
- ArrayList<Token> outputlist = new ArrayList<Token>();
- Stack<Token> operatorstack = new Stack<Token>();
- for (Token tk : tokens ) {
- if (tk.Type==Token.TokenType.Number) {
- outputlist.add(tk);
- continue;
- }
- if (tk.Type==Token.TokenType.Function || tk.Content.equals("(")) {
- operatorstack.push(tk);
- continue;
- }
- if (tk.Content.equals(")")) {
- do {
- outputlist.add(operatorstack.pop());
- } while (!(operatorstack.peek().Type==Token.TokenType.Function|| operatorstack.peek().Content.equals("(") || operatorstack.size()==0)); // end of do-while
- if (!operatorstack.peek().Content.equals("(")) {
- outputlist.add(operatorstack.pop());
- }else{
- operatorstack.pop() ;
- }
- continue;
- }
- if (tk.Type==Token.TokenType.Operator && operatorstack.size() == 0) {
- operatorstack.push(tk);
- continue;
- }
- if (operatorstack.size() >0 && tk.Type==Token.TokenType.Operator) {
- while (operatorstack.size()>0 && tk.EvaluatesBefore(operatorstack.peek()) && !operatorstack.peek().Content.equals("(") && operatorstack.peek().Type==Token.TokenType.Function) {
- outputlist.add(operatorstack.pop());
- }
- operatorstack.push(tk);
- }
- }
- while (operatorstack.size()>0) {
- outputlist.add(operatorstack.pop());
- }
- return outputlist;
- }
Vielen Dank für eure Hilfe
faxe1008