gut, ist der Parser ganz einfach ...
zuerst müssen Sie eine ganze Menge Sachen (i Konstrukteurs auslassen werde, da ich glaube, dass Sie sie auf eigene Faust schreiben):
Ausdrücke (Ausgang):
class Expression {}
class Operation extends Expression {
public var operand1:Expression;
public var operator:String;
public var operand2:Expression;
}
class Atom extends Expression {
public var ident:String;
}
Tokens (Zwischenformat):
class Token {
public var source:String;
public var pos:uint;
}
class Identiefier extends Token {
public var ident:String;
}
class OpenParenthesis extends Token {}
class CloseParenthesis extends Token {}
class Operator extends Token {
public var operator:String;
}
class Eof extends Token {}
und a bis kenizer sollte, dass diese Schnittstelle
interface TokenStream {
function read():Token;
}
ich denke, implementieren Sie herausfinden, werden sich wie tokenize ...
so ist der Weg Quelle - (tokenizer) -> Token - (Parser) -> Ausdrücke ...
und hier die Analyseroutine, mit einem kleinen Helfer:
function parse(t:TokenStream):Expression {
var tk:Token = t.read();
switch ((tk as Object).constructor) {//this is a really weird thing about AS3 ... need to cast to object, before you can access the constructor
case OpenParanthesis:
var e1:Expression = parse(t);
tk = t.read();
switch ((tk as Object).constructor) {
case CloseParenthesis:
return e1;
case Operator:
var op:String = (tk as Operator).operator;
var e2:Expression = parse(t);
tk = t.read();
if (tk is CloseParenthesis)
return new Operation(e1,op,e2);
else
unexpected(tk);
}
else
unexpected(tk);
break;
case Identifier:
return new Atom((tk as Identifier).ident);
default:
unexpected(tk);
}
}
function unexpected(tk:Token) {
throw "unexpected token "+tk.source+" at position "+tk.pos;
}
ist dies kein besonders guter Parser, aber es zeigt die nackten Grundlagen der Parsing-Routinen ... w Ich habe die Implementierung nicht überprüft, aber es sollte funktionieren ... es ist sehr primitiv und unnachgiebig ... Dinge wie Operatorenpräzedenz etc. fehlen komplett und so weiter ... aber wenn du das willst, versuchen Sie es ...
btw. Mit haXe mit Enums, würde der ganze Code viel kürzer und viel schöner aussehen ... Sie können es sich ansehen ...
viel Glück dann ...;)
greetz
back2dos
als Antwort auf Ihre Frage zu redtuna der Post: Check as3corelib, die einen JSON-Parser JSON parsen enthält. JSON bedeutet "JavaScript Object Notation". Tatsächlich ist es eine Teilmenge von JavaScript, die Objektliterale repräsentiert. Sie sollten sich vielleicht damit vertraut machen, da es sich um eine Notation handelt, die auch in AS3 einwandfrei funktioniert. Sie sollten es sich wirklich ansehen. JSON deklariert JEDE mögliche Objektstruktur, so dass auch logische Ausdrücke erfasst werden können. keine so schlechte Idee, wirklich. obwohl ["a", "AND", ["b", "OR", "c"]] dieselbe Semantik in einer Struktur von verschachtelten Arrays erfassen könnte, während sie kürzer ist. – back2dos