Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- private Expression Expression()
- {
- Func<Expression> unaryExpr = () =>
- {
- switch (TokType)
- {
- case TokenType.Complement:
- NextToken();
- return new UnariExpression("COM") { Argument = Expression() };
- case TokenType.LogicalNot:
- NextToken();
- return new UnariExpression("NOT") { Argument = Expression() };
- case TokenType.Plus:
- NextToken();
- return new UnariExpression("PLUS") { Argument = Expression() };
- case TokenType.Minus:
- NextToken();
- return new UnariExpression("MINUS") { Argument = Expression() };
- case TokenType.LParam:
- {
- NextToken();
- var tmp = Expression();
- if (TokType != TokenType.RParam)
- throw new ApplicationException("Ожидается )");
- NextToken();
- return tmp;
- }
- case TokenType.Number:
- {
- var tmp = new IntConstExpression(_token.Value) {Type = _token.Modifer};
- NextToken();
- return tmp;
- }
- case TokenType.CharsString:
- case TokenType.String:
- {
- var tmp = new StringConstExpression(_token.Value);
- NextToken();
- return tmp;
- }
- case TokenType.Identifer:
- {
- var tmp = new IdentConstExpression(_token.Value);
- NextToken();
- return tmp;
- }
- }
- throw new ApplicationException("Неверное выражение");
- };
- var mulExpr = Expr(
- (t, k) => t == TokenType.Mul || t == TokenType.Div || t == TokenType.Mod,
- (t, k) =>
- t == TokenType.Mul
- ? "MUL"
- : t == TokenType.Div ? "DIV" : "MOD",
- unaryExpr);
- var addExpr = Expr(
- (t, k) => TokType == TokenType.Plus || TokType == TokenType.Minus,
- (t, k) => t == TokenType.Equal ? "PLUS" : "MINUS",
- mulExpr);
- var shiftExpr = Expr(
- (t, k) =>
- t == TokenType.ShiftLeft || t == TokenType.ShiftRight ||
- t == TokenType.UnsignedShiftRight || k == "shl" || k == "shr",
- (t, k) =>
- t == TokenType.ShiftLeft
- ? "SH_LEFT"
- : t == TokenType.ShiftRight ? "SH_RIGHT" : "USH_RIGHT",
- addExpr);
- var relExpr = Expr(
- (t, k) =>
- t == TokenType.Less || t == TokenType.LessOrEqual ||
- t == TokenType.Greater || t == TokenType.GreaterOrEqual,
- (t, k) =>
- t == TokenType.Less
- ? "LESS"
- : t == TokenType.LessOrEqual
- ? "EQ_LESS"
- : t == TokenType.Greater ? "GREAT" : "GREAT_EQ",
- shiftExpr);
- var eqExpr = Expr(
- (t, k) => t == TokenType.Equal || t == TokenType.NotEqual,
- (t, k) => t == TokenType.Equal ? "EQ" : "NOT_EQ",
- relExpr);
- var bitXorExpr = Expr(
- (t, k) => t == TokenType.BitXor || k == "xor",
- (t, k) => "B_XOR",
- eqExpr);
- var bitAndExpr = Expr(
- (t, k) => t == TokenType.BitOr || k == "or",
- (t, k) => "B_AND",
- bitXorExpr);
- var bitOrExpr = Expr(
- (t, k) => t == TokenType.BitOr || k == "or",
- (t, k) => "B_OR",
- bitAndExpr);
- var logAndExpr = Expr(
- (t, k) => t == TokenType.LogicalAnd,
- (t, k) => "AND",
- bitOrExpr);
- var logOrExpr = Expr(
- (t, k) => t == TokenType.LogicalOr,
- (t, k) => "OR",
- logAndExpr);
- var minMaxExpr = Expr(
- (t, k) => t == TokenType.Minimum || t == TokenType.Maximum,
- (t, k) => t == TokenType.Maximum ? "MAX" : "MIX",
- logOrExpr);
- return minMaxExpr();
- }
- private Func<Expression> Expr(Func<TokenType, string, bool> condition, Func<TokenType, string, string> op , Func<Expression> nextOp)
- {
- return delegate
- {
- var left = nextOp();
- while (TokType != TokenType.EndFile)
- {
- var tt = TokType;
- var kw = Keyword;
- if (condition(tt, kw))
- {
- NextToken();
- left = new AST.Exprs.BinaryExpression(op(tt, kw))
- {
- Left = left,
- Right = nextOp()
- };
- continue;
- }
- break;
- }
- return left;
- };
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement