2016-07-28 27 views
2

ich einen Booleschen Ausdruck im String-Format haben, zB:Auswertung Booleschen Ausdruck in einen String - Go

name := "Fred" 

type := "Person" 

ich diesen Ausdruck als wahr oder falsch ausgewertet werden sollen.

exp := "(name == Fred) && (type == Person)" 

Schließlich würde Ich mag zu können, bedingte Anweisungen auszuführen, wie:

if (exp) { 
    ... 
} 

jedoch von der Forschung ist dies nicht etwas Go aus der Box unterstützt. Ich habe Vorschläge zur Verwendung von AST zum Analysieren und Analysieren gesehen. Aber, ich bin ziemlich neu zu gehen und vor allem AST, also nicht sicher, wie das geht. Kann jemand bitte eine Anleitung geben, wie ich einen booleschen String-String evaluieren kann? Ich habe keine Pakete gefunden, die dies vollständig unterstützen.

+0

o.õ das ist ziemlich stinkend, warum brauchen Sie die Zeichenfolge – Plato

+1

Ich habe einen booleschen Ausdruck als JSON in einer Datei gespeichert. Ich analysiere den JSON, um meinen booleschen Ausdruck zu erstellen. Sobald ich den Ausdruck habe, muss ich ihn dann bewerten. –

+1

Ist Ihr "boolescher Ausdruck" garantiert korrekt? Go-Syntax? (Dieses Beispiel ist nicht gültig, Go, also können Sie es nicht direkt als Go analysieren) – JimB

Antwort

1

Das folgende ist wahr in der Theorie. Da Sie Go verwenden, wenn Sie die Go-Syntax verwenden können, können Sie Go's Parser und AST verwenden. Ich sehe keinen Code, der einen Go AST zur Laufzeit auswerten kann. Aber Sie könnten wahrscheinlich einen schreiben, der die Teile unterstützt, die Sie wollten. Dann hätten Sie einen Go-Dolmetscher.

Hier finden Sie, was Sie eine beliebige Ausdruck Syntax tun müssen, unterstützen:

Sie zu lex and parse gehen zu wollen. Erstellen Sie ein AST (Abstract Syntax Tree) im Speicher. Dann bewerte es.

Ihre Baumknoten sein könnten (meine Go-Syntax für diese Art und Weise falsch ist):

Scope {Tree { 
    Assignment { Symbol: "name", Symbol: "_literal_1" } 
    Assignment { Symbol: "exp", Value: Tree: { 
    AndOperation { Tree{...}, Tree{...} } 
    } 
} 

Etc.

Dann kann Ihr Programm Ihren AST direkt durchqueren oder Sie können es in Bytecode Form schreiben, aber das ist wirklich nur nützlich, wenn Sie möchten, dass es kleiner und einfach für später zu cachen ist.