Wenn Sie Operatoren wie >
und =
für die facelets artigen gt
und eq
tauschen bzw. ich denke, Ihr Fall machbar sein kann, obwohl es viel Aufwand erfordert:
x gt 10 and y eq 20 or not z
beschließt, :
x(gt).10(and).y(eq).20(or).not(z)
Und das wird die Hölle zu analysieren.
Der Weg @ Brian Henry vorgeschlagen ist der einfachste Weg, obwohl nicht benutzerfreundlich, da es die Parens und Punkte benötigt.
Nun, da wir die Operatoren austauschen können, könnten Sie versuchen, die Integer.call
abzufangen, um Ausdrücke zu starten. Die fehlenden Eigenschaften in einem Skript, das in Operationen aufgelöst wird, können das Problem mit neuen Keywords lösen. Dann können Sie Ausdrücke erstellen und sie in einer Liste speichern, indem Sie sie am Ende des Skripts ausführen. Es ist noch nicht fertig, aber ich kam mit dieser:
// the operators that can be used in the script
enum Operation { eq, and, gt, not }
// every unresolved variable here will try to be resolved as an Operation
def propertyMissing(String property) { Operation.find { it.name() == property} }
// a class to contain what should be executed in the end of the script
@groovy.transform.ToString
class Instruction { def left; Operation operation; def right }
// a class to handle the next allowed tokens
class Expression {
Closure handler; Instruction instruction
def methodMissing(String method, args) {
println "method=$method, args=$args"
handler method, args
}
}
// a list to contain the instructions that will need to be parsed
def instructions = []
// the start of the whole mess: an integer will get this called
Integer.metaClass {
call = { Operation op ->
instruction = new Instruction(operation: op, left: delegate)
instructions << instruction
new Expression(
instruction: instruction,
handler:{ String method, args ->
instruction.right = method.toInteger()
println instructions
this
})
}
}
x = 12
y = 19
z = false
x gt 10 and y eq 20 or not z
, die eine Ausnahme geben, aufgrund der not()
Teil nicht umgesetzt werden, aber es kann zwei Instruction Objekte bauen, bevor ein Fehler:
[Instruction(12, gt, 10), Instruction(19, eq, 20)]
Nicht sicher, ob es das wert ist.
Ich denke, du wirst deinen eigenen Parser schreiben müssen –
Mit '&' und '|' meinst du '&&' und '||'? Oder meinst du wirklich die bitweisen Operatoren? – Will
@WillP Meine schlechte, ich meinte die logischen. Ich habe die Frage geklärt. – wishihadabettername