namespace SamHarwell.UnrealScriptLanguageProvider.UcLanguage { using System; using System.Collections.Generic; using Antlr.Runtime; using Antlr.Runtime.Expressions; using Antlr.Runtime.Tree; partial class UnrealScriptParser { private static readonly PrecedenceTreeCreator precedence = new PrecedenceTreeCreator( // assignment operators new OperatorGroup(OperatorAssociativity.RightToLeft, new BinaryOperator(EQ), new BinaryOperator(PLUSEQ), new BinaryOperator(MINUSEQ), new BinaryOperator(TIMESEQ), new BinaryOperator(DIVEQ), new BinaryOperator(MODEQ), new BinaryOperator(ANDEQ), new BinaryOperator(XOREQ), new BinaryOperator(OREQ), new BinaryOperator(LSHIFTEQ), new BinaryOperator(RSHIFTEQ), new BinaryOperator(CATEQ), new BinaryOperator(CAT2EQ) ), // ternary operator new OperatorGroup(OperatorAssociativity.RightToLeft, new TernaryOperator(QUES, COLON, AST_TERNARY) ), // concatenation new OperatorGroup(OperatorAssociativity.LeftToRight, new BinaryOperator(DOLLAR), new BinaryOperator(ATSIGN) ), // boolean or new OperatorGroup(OperatorAssociativity.LeftToRight, new BinaryOperator(OR) ), // boolean and new OperatorGroup(OperatorAssociativity.LeftToRight, new BinaryOperator(AND) ), // bitwise or new OperatorGroup(OperatorAssociativity.LeftToRight, new BinaryOperator(BITOR) ), // bitwise xor new OperatorGroup(OperatorAssociativity.LeftToRight, new BinaryOperator(BITXOR), new BinaryOperator(DCARET) ), // bitwise and new OperatorGroup(OperatorAssociativity.LeftToRight, new BinaryOperator(BITAND) ), // comparison new OperatorGroup(OperatorAssociativity.LeftToRight, new BinaryOperator(EQEQ), new BinaryOperator(APPROXEQ), new BinaryOperator(NEQ) ), // relational new OperatorGroup(OperatorAssociativity.LeftToRight, new BinaryOperator(LT), new BinaryOperator(LE), new BinaryOperator(GT), new BinaryOperator(GE) ), // shift new OperatorGroup(OperatorAssociativity.LeftToRight, new BinaryOperator(LSHIFT), new BinaryOperator(RSHIFT), new BinaryOperator(RRSHIFT) ), // addition new OperatorGroup(OperatorAssociativity.LeftToRight, new BinaryOperator(PLUS), new BinaryOperator(MINUS) ), // multiply new OperatorGroup(OperatorAssociativity.LeftToRight, new BinaryOperator(TIMES), new BinaryOperator(DIVIDE), new BinaryOperator(MOD) ), // exponentiation group new OperatorGroup(OperatorAssociativity.LeftToRight, new BinaryOperator(UK_DOT), new BinaryOperator(UK_CROSS), new BinaryOperator(UK_CLOCKWISEFROM), new BinaryOperator(POWER) ), // unary right to left new OperatorGroup(OperatorAssociativity.RightToLeft, new UnaryOperator(INC, UnaryOperatorType.Prefix, AST_PREINC), new UnaryOperator(DEC, UnaryOperatorType.Prefix, AST_PREDEC), new UnaryOperator(PLUS, UnaryOperatorType.Prefix), new UnaryOperator(MINUS, UnaryOperatorType.Prefix), new UnaryOperator(NOT, UnaryOperatorType.Prefix), new UnaryOperator(TILDE, UnaryOperatorType.Prefix) ), // unary left to right new OperatorGroup(OperatorAssociativity.LeftToRight, new UnaryOperator(INC, UnaryOperatorType.Postfix, AST_POSTINC), new UnaryOperator(DEC, UnaryOperatorType.Postfix, AST_POSTDEC) ) ); private ITree CreatePrecedenceTree(List expressions) { return precedence.BuildExpressionTree(TreeAdaptor, expressions); } } }