Expression Crawling

RalleYTN

Bekanntes Mitglied
Hey Loits!
Ich bin gerade dabei einen Evaluator für FIQL zu schreiben und ich stehe derzeit ein bisschen auf dem Schlauch. Die Klammern machen mir Probleme. Ich dachte ich mache mir einen Expression Crawler. Also nehmen wir mal an wir hätten jetzt eine Pseudo-Expression:
Code:
x1;((x2,x3);(x4;(x5,x6)))
Die Variablen hier wären jetzt boolische Werte, ';' ist ein UND und ',' ein ODER.
Jetzt würde ich gerne die Sub-Expression des "tiefsten" Scope auflösen und mich dann hoch arbeiten, bis ich nur noch einen entgültigen Wert habe.
Für das Beispiel würde jetzt also die Funktion "eval(String expression)" mit folgenden Werten und in der Reihenfolge aufgerufen werden. 'E' makiert hier immer das Ergebnis einer Evaluation.
Code:
1 x5,x6
2 x4;E1
3 x2,x3
4 E2;E3
5 x1;E4

Das ganze bereitet mir ein bisschen Kopfschmerzen, weil ich keine Ahnung habe wie ich da rangehen soll.
 

mrBrown

Super-Moderator
Mitarbeiter
Ich würde das in einen Baum überführen, jeder Wert bzw. ein Operator ist ein Knoten, Knoten haben eine Funktion die den berechneten Wert zurückgeben. Klingt eigentlich trivial, wenn ich grad nichts überseh...
 

RalleYTN

Bekanntes Mitglied

RalleYTN

Bekanntes Mitglied
Ok ich glaube ich habs geschafft.
Ist sicher nicht die schnellste Lösung aber es funktioniert.
Java:
    public static final boolean eval(String fiql, String value) {
      
       if(fiql.contains("(")) {
          
           char[] tokens = fiql.toCharArray();
           Stack<Integer> scope = new Stack<>();
          
           for(int index = 0; index < tokens.length; index++) {
              
               if(tokens[index] == '(') {
                  
                   scope.push(index);
                  
               } else if(tokens[index] == ')') {
                  
                   if(!scope.isEmpty()) {
                      
                       int start = scope.pop();
                       boolean result = process(fiql.substring(start + 1, index),  value);
                      
                       StringBuilder builder = new StringBuilder(fiql);
                       builder.delete(start, index + 1);
                       builder.insert(start, Boolean.toString(result));
                      
                       return eval(builder.toString(), value);
                      
                   }
               }
           }
          
       } else {
          
           return process(fiql, value);
       }
      
       return false;
   }
  
   private static final boolean process(String expression, String val) {
      
       System.out.println(expression);
       return false;
   }

Ausgabe für die Expression:
Code:
x1;((x2,x3);(x4;(x5,x6)))
Code:
x2,x3
x5,x6
x4;false
false;false
x1;false
 

Flown

Administrator
Mitarbeiter
Ein Lerneffekt kann man auch erzielen, wenn man bewehrte Tools für den richtigen Job verwendet und somit sich die Arbeit - vielleicht später einmal - erleichtert.

Aber wenn du das händisch umsetzen möchtest, dann solltest du Expression-Bäume bauen, wie mrBrown schon sagte.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Erwin82a Object cannot be converted to Custom Class in Lampda Expression Allgemeine Java-Themen 2
R Lambda Expression in einer Methode execute() aufrufen (execute() ist eine Methode aus dem funktionalen Interface Command) Allgemeine Java-Themen 5
J Regular Expression Allgemeine Java-Themen 16
H Regular Expression Allgemeine Java-Themen 11
M Regular expression Allgemeine Java-Themen 5
B Regular Expression und Matcher Allgemeine Java-Themen 3
D Variablen C Expression Validator Allgemeine Java-Themen 7
MrMilti Gruppenreferenz in einer Regular Expression Allgemeine Java-Themen 3
S Java Regular Expression Allgemeine Java-Themen 2
J Expression Language für mathematische Ausdrücke Allgemeine Java-Themen 8
G Parameterauswertung mit regular Expression Allgemeine Java-Themen 3
M Java Regular Expression für Mathe-String (= 2+4*3+2) Allgemeine Java-Themen 7
G Regular Expression Allgemeine Java-Themen 8
D Regular Expression Mit Punkt und Zahl Allgemeine Java-Themen 4
T Regular Expression mit n Gruppen Allgemeine Java-Themen 6
S Syntax Error, insert "AssignmentOperator Expression&amp Allgemeine Java-Themen 3
M Regular Expression Allgemeine Java-Themen 2
R Regular expression für '.' Allgemeine Java-Themen 7
M Regular Expression - verschiedene Ausdrücke testen (grep | ) Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben