ну, парсер довольно простой ...
сначала вам понадобится довольно много вещей (я опущу конструкторы, так как, думаю, вы можете написать их самостоятельно):
выражения (вывод):
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;
}
токены (промежуточный формат):
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 {}
и токенизатор, который должен реализовывать этот интерфейс
interface TokenStream {
function read():Token;
}
Полагаю, вы сами поймете, как токенизировать ...
так что путь к источнику - (токенизатор) -> токены - (парсер) -> выражения ...
и вот процедура разбора с маленьким помощником:
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;
}
это не особенно хороший парсер, но он показывает голые основы синтаксического анализа процедур ... ну, на самом деле, я не проверял реализацию, но она должна работать ... она очень примитивна и непостоянна .. такие вещи, как приоритет операторов и т. д., полностью отсутствуют и т. д. ... но если вы хотите, попробуйте ...
кстати. используя Haxe с перечислениями, весь код выглядел бы намного короче и намного красивее ... вы можете взглянуть на него ...