示例#1
0
        public void ChangeBase(TokenPosition basePosition)
        {
            if (_line <= 1)
                _column = basePosition.Column + _column - 1;

            _line = basePosition.Line + _line - 1;
        }
示例#2
0
        public static TokenPosition[] GetPositionsFromString(string s, TokenPosition? basePosition)
        {
            TokenPosition[] positions = new TokenPosition[s.Length];

            int currentLine = 1;
            int currentColumn = 1;

            for (int textIndex = 0; textIndex < s.Length; textIndex++)
            {
                char c = s[textIndex];

                positions[textIndex].Line = currentLine;
                positions[textIndex].Column = currentColumn;

                if (basePosition != null)
                    positions[textIndex].ChangeBase(basePosition.Value);

                if (c == '\n')
                {
                    currentLine++;
                    currentColumn = 1;
                }
                else if (c != '\r')
                    currentColumn++;
            }

            return positions;
        }
        public ValueExpression(TokenPosition position, object value, Type type) : base(position)
        {
            Value = value;
            Type = type;

            if (Type == typeof(object) && Value != null)
                Type = Value.GetType();
        }
示例#4
0
        public TokenPosition(TokenPosition parent, TokenPosition current)
        {
            _line = parent.Line + current.Line - 1;

            _column = current.Column;

            if (current.Line <= 1)
                _column = parent.Column + current.Column - 1;
        }
        public static Expression IsAsOperator(string token, TokenPosition position, Expression[] terms)
        {
            if (token == "as")
                return new AsExpression(position, terms[0], terms[1]);

            if (token == "is")
                return new IsExpression(position, terms[0], terms[1]);

            return null;
        }
        private static char UnEscape(string s, TokenPosition position)
        {
            if (s.Length == 1)
                return s[0];

            if (s.Length == 2)
            {
                switch (s[1])
                {
                    case '\\':
                    case '\"':
                    case '\'':
                        return s[1];
                    case '0':
                        return (char)0;
                    case 'a':
                        return '\a';
                    case 'b':
                        return '\b';
                    case 'f':
                        return '\f';
                    case 'n':
                        return '\n';
                    case 'r':
                        return '\r';
                    case 't':
                        return '\t';
                    case 'v':
                        return '\v';
                    default:
                        throw new UnknownTokenException(position,s);
                }
            }
            else
            {
                return (char)Convert.ToUInt16(s.Substring(2), 16);
            }
        }
        public static Expression Number(string token, TokenPosition position, Expression[] terms)
        {
            string s = token;

            Type type = null;

            if (!char.IsDigit(s[s.Length - 1]))
            {
                string suffix = "" + char.ToUpper(s[s.Length - 1]);

                s = s.Remove(s.Length - 1);

                if (!char.IsDigit(s[s.Length - 1]))
                {
                    suffix = char.ToUpper(s[s.Length - 1]) + suffix;

                    s = s.Remove(s.Length - 1);
                }

                switch (suffix)
                {
                    case "M":
                        type = typeof(decimal);
                        break;
                    case "D":
                        type = typeof(double);
                        break;
                    case "F":
                        type = typeof(float);
                        break;
                    case "L":
                        type = typeof(long);
                        break;
                    case "U":
                        type = typeof(uint);
                        break;
                    case "LU":
                    case "UL":
                        type = typeof(ulong);
                        break;
                }
            }

            if (type != null)
                return new ValueExpression(position, Convert.ChangeType(s, type, _numberFormat), type);

            if (s.LastIndexOf('.') >= 0)
            {
                return Exp.Value(position, Convert.ToDouble(s, _numberFormat));
            }
            else
            {
                long n = Convert.ToInt64(s);

                if (n > Int32.MaxValue || n < Int32.MinValue)
                    return Exp.Value(position, n);
                else
                    return Exp.Value(position, (int)n);
            }
        }
示例#8
0
 public CoalesceExpression(TokenPosition position, Expression value, Expression valueIfNull) : base(position)
 {
     _value       = value;
     _valueIfNull = valueIfNull;
 }
示例#9
0
 public static ValueExpression Value(TokenPosition position, object value, Type type)
 {
     return(new ValueExpression(position, value, type));
 }
 public DefaultValueExpression(TokenPosition position, Expression value, Expression defaultValue)
     : base(position)
 {
     _value = value;
     _defaultValue = defaultValue;
 }
示例#11
0
        public static Expression DotOperator(string token, TokenPosition position, Expression[] terms)
        {
            VariableExpression varExpression = terms[1] as VariableExpression;

            if (varExpression == null)
                throw new UnknownPropertyException("Unkown member " + terms[1], terms[1]);

            return new FieldExpression(position, terms[0], varExpression.VarName);
        }
示例#12
0
        public static Expression Unary(string token, TokenPosition position, Expression[] terms)
        {
            if (token == "!")
                return new NegationExpression(position, terms[0]);

            if (token == "-")
                return new UnaryMinusExpression(position, terms[0]);

            if (token == "~")
                return new BitwiseComplementExpression(position, terms[0]);

            return null;
        }
示例#13
0
 public TextNode(TokenPosition position, string text)
 {
     Text     = text;
     Position = position;
 }
示例#14
0
 public RangeExpression(TokenPosition tokenPosition, Expression from, Expression to) : base(tokenPosition)
 {
     _from = from;
     _to   = to;
 }
示例#15
0
 public AsExpression(TokenPosition position, Expression objectExpression, Expression typeExpression) : base(position)
 {
     _objectExpression = objectExpression;
     _typeExpression   = typeExpression;
 }
示例#16
0
 public TypeCastExpression(TokenPosition position, VariableExpression typeExpression, Expression targetExpression) : base(position)
 {
     _typeExpression   = typeExpression;
     _targetExpression = targetExpression;
 }
 public TemplateRenderingException(string message, Exception innerException, TokenPosition tokenPosition) : base(message, innerException, tokenPosition)
 {
 }
示例#18
0
 public LexerException(string message, TokenPosition position, string token, Exception innerException) : base(message, innerException)
 {
     Position = position;
     Token    = token;
 }
示例#19
0
 public LexerException(TokenPosition position, string token)
 {
     Position = position;
     Token    = token;
 }
示例#20
0
        public static Expression Function(string token, TokenPosition position, Expression[] terms)
        {
            Expression[] parameters = new Expression[terms.Length - 1];

            Array.Copy(terms, 1, parameters, 0, parameters.Length);

            if (token == "[")
            {
                return new IndexExpression(position, terms[0], parameters);
            }
            else
            {
                return new CallExpression(position, terms[0], parameters);
            }
        }
示例#21
0
 public static Expression DefaultValueOperator(string token, TokenPosition position, Expression[] terms)
 {
     return new DefaultValueExpression(position, terms[0], terms[1]);
 }
示例#22
0
 public UnaryMinusExpression(TokenPosition position, Expression value) : base(position)
 {
     _value = value;
 }
示例#23
0
 public static Expression Assignment(string token, TokenPosition position, Expression[] terms)
 {
     return new AssignmentExpression(position, terms[0], terms[1]);
 }
示例#24
0
 public static Expression TypeOf(string token, TokenPosition position, Expression[] terms)
 {
     return(new TypeOfExpression(position));
 }
示例#25
0
 public static Expression NumericRange(string token, TokenPosition position, Expression[] terms)
 {
     return new RangeExpression(position, terms[0], terms[1]);
 }
示例#26
0
 public static Expression CharLiteral(string token, TokenPosition position, Expression[] terms)
 {
     return(Exp.Value(position, UnEscape(token.Substring(1, token.Length - 2), position)));
 }
示例#27
0
 public static BinaryArithmicExpression Op(TokenPosition position, string op, Expression left, Expression right)
 {
     return(new BinaryArithmicExpression(position, op, left, right));
 }
示例#28
0
 public IsExpression(TokenPosition position, Expression objectExpression, Expression typeExpression) : base(position)
 {
     _objectExpression = objectExpression;
     _typeExpression = typeExpression;
 }
示例#29
0
 public LexerException(TokenPosition position, string token)
 {
     Position = position;
     Token = token;
 }
示例#30
0
 public static Expression TypeOf(string token, TokenPosition position, Expression[] terms)
 {
     return new TypeOfExpression(position);
 }
示例#31
0
        public static Expression Number(string token, TokenPosition position, Expression[] terms)
        {
            string s = token;

            Type type = null;

            if (!char.IsDigit(s[s.Length - 1]))
            {
                string suffix = "" + char.ToUpper(s[s.Length - 1]);

                s = s.Remove(s.Length - 1);

                if (!char.IsDigit(s[s.Length - 1]))
                {
                    suffix = char.ToUpper(s[s.Length - 1]) + suffix;

                    s = s.Remove(s.Length - 1);
                }

                switch (suffix)
                {
                case "M":
                    type = typeof(decimal);
                    break;

                case "D":
                    type = typeof(double);
                    break;

                case "F":
                    type = typeof(float);
                    break;

                case "L":
                    type = typeof(long);
                    break;

                case "U":
                    type = typeof(uint);
                    break;

                case "LU":
                case "UL":
                    type = typeof(ulong);
                    break;
                }
            }

            if (type != null)
            {
                return(new ValueExpression(position, Convert.ChangeType(s, type, _numberFormat), type));
            }

            if (s.LastIndexOf('.') >= 0)
            {
                return(Exp.Value(position, Convert.ToDouble(s, _numberFormat)));
            }
            else
            {
                long n = Convert.ToInt64(s);

                if (n > Int32.MaxValue || n < Int32.MinValue)
                {
                    return(Exp.Value(position, n));
                }
                else
                {
                    return(Exp.Value(position, (int)n));
                }
            }
        }
 public UnknownTokenException(TokenPosition position, string token) : base(position, token)
 {
 }
示例#33
0
 public static Expression VarName(string token, TokenPosition position, Expression[] terms)
 {
     return(new VariableExpression(position, token));
 }
示例#34
0
 public static Expression Coalesce(string token, TokenPosition position, Expression[] terms)
 {
     return(new CoalesceExpression(position, terms[0], terms[1]));
 }
 public ConditionalExpression(TokenPosition position, Expression condition, Expression trueValue, Expression falseValue) : base(position)
 {
     _condition = condition;
     _trueValue = trueValue;
     _falseValue = falseValue;
 }
示例#36
0
 public static Expression DefaultValueOperator(string token, TokenPosition position, Expression[] terms)
 {
     return(new DefaultValueExpression(position, terms[0], terms[1]));
 }
示例#37
0
 public static Expression CharLiteral(string token, TokenPosition position, Expression[] terms)
 {
     return Exp.Value(position, UnEscape(token.Substring(1, token.Length - 2), position));
 }
示例#38
0
 public static Expression Operator(string token, TokenPosition position, Expression[] terms)
 {
     return(Exp.Op(position, token, terms[0], terms[1]));
 }
示例#39
0
 public static Expression VarName(string token, TokenPosition position, Expression[] terms)
 {
     return new VariableExpression(position, token);
 }
示例#40
0
 public static Expression Assignment(string token, TokenPosition position, Expression[] terms)
 {
     return(new AssignmentExpression(position, terms[0], terms[1]));
 }
示例#41
0
 public static Expression Coalesce(string token, TokenPosition position, Expression[] terms)
 {
     return new CoalesceExpression(position, terms[0], terms[1]);
 }
示例#42
0
        public static Expression StringLiteral(string token, TokenPosition position, Expression[] terms)
        {
            string s = token.Substring(1, token.Length - 2);

            if (s.IndexOf('\\') < 0)
            {
                return(Exp.Value(position, s));
            }

            string output = "";

            bool   inEscape  = false;
            string hexString = null;

            for (int i = 0; i < s.Length; i++)
            {
                char c = s[i];

                if (inEscape)
                {
                    if (c == 'x')
                    {
                        hexString = "";
                        continue;
                    }

                    if (hexString == null && (c != 'x' || c != 'X'))
                    {
                        output  += UnEscape("\\" + c, position);
                        inEscape = false;
                        continue;
                    }

                    if (hexString == null)
                    {
                        inEscape = false;
                    }
                    else
                    {
                        if (((char.ToLower(c) < 'a' || char.ToLower(c) > 'f') && (c < '0' || c > '9')) || hexString.Length == 4)
                        {
                            output   += UnEscape("\\x" + hexString, position);
                            inEscape  = false;
                            hexString = null;
                        }
                        else
                        {
                            hexString += c;
                            continue;
                        }
                    }
                }

                if (c != '\\')
                {
                    output += c;

                    continue;
                }

                inEscape = true;
            }

            return(Exp.Value(position, output));
        }
示例#43
0
        public static Expression ShortcutOperator(string token, TokenPosition position, Expression[] terms)
        {
            if (token == "&&")
                return new AndAlsoExpression(position, terms[0], terms[1]);

            if (token == "||")
                return new OrElseExpression(position, terms[0], terms[1]);

            return null;
        }
示例#44
0
        public static Expression Constructor(string token, TokenPosition position, Expression[] terms)
        {
            string className = token.Substring(3).Trim();

            return(new ConstructorExpression(position, new VariableExpression(position, className), terms));
        }
示例#45
0
 public static Expression Operator(string token, TokenPosition position, Expression[] terms)
 {
     return Exp.Op(position, token, terms[0], terms[1]);
 }
示例#46
0
 public static Expression NumericRange(string token, TokenPosition position, Expression[] terms)
 {
     return(new RangeExpression(position, terms[0], terms[1]));
 }
示例#47
0
        public static Expression StringLiteral(string token, TokenPosition position, Expression[] terms)
        {
            string s = token.Substring(1, token.Length - 2);

            if (s.IndexOf('\\') < 0)
                return Exp.Value(position, s);

            string output = "";

            bool inEscape = false;
            string hexString = null;

            for (int i = 0; i < s.Length; i++)
            {
                char c = s[i];

                if (inEscape)
                {
                    if (c == 'x')
                    {
                        hexString = "";
                        continue;
                    }

                    if (hexString == null && (c != 'x' || c != 'X'))
                    {
                        output += UnEscape("\\" + c, position);
                        inEscape = false;
                        continue;
                    }

                    if (hexString == null)
                    {
                        inEscape = false;
                    }
                    else
                    {
                        if (((char.ToLower(c) < 'a' || char.ToLower(c) > 'f') && (c < '0' || c > '9')) || hexString.Length == 4)
                        {
                            output += UnEscape("\\x" + hexString, position);
                            inEscape = false;
                            hexString = null;
                        }
                        else
                        {
                            hexString += c;
                            continue;
                        }
                    }
                }

                if (c != '\\')
                {
                    output += c;

                    continue;
                }

                inEscape = true;
            }

            return Exp.Value(position, output);
        }
示例#48
0
 public static Expression TypeCast(string token, TokenPosition position, Expression[] terms)
 {
     return(new TypeCastExpression(position, new VariableExpression(position, token.Substring(1, token.Length - 2).Trim()), terms[0]));
 }
示例#49
0
        public static Expression Constructor(string token, TokenPosition position, Expression[] terms)
        {
            string className = token.Substring(3).Trim();

            return new ConstructorExpression(position, new VariableExpression(position, className), terms);
        }
示例#50
0
 public static Expression Ternary(string token, TokenPosition position, Expression[] terms)
 {
     return(new ConditionalExpression(position, terms[0], terms[1], terms[2]));
 }
示例#51
0
 public static Expression TypeCast(string token, TokenPosition position, Expression[] terms)
 {
     return new TypeCastExpression(position, new VariableExpression(position, token.Substring(1, token.Length - 2).Trim()), terms[0]);
 }
示例#52
0
 public CallExpression(TokenPosition position, Expression methodExpression, Expression[] parameters) : base(position)
 {
     _methodExpression = methodExpression;
     _parameters       = parameters;
 }
示例#53
0
 public static Expression Ternary(string token, TokenPosition position, Expression[] terms)
 {
     return new ConditionalExpression(position, terms[0], terms[1], terms[2]);
 }
示例#54
0
 public ConstructorExpression(TokenPosition position, VariableExpression className, Expression[] parameters) : base(position)
 {
     _className  = className;
     _parameters = parameters;
 }
 public BinaryArithmicExpression(TokenPosition position, string op, Expression left, Expression right) : base(position, left, right)
 {
     _operator = op;
 }
示例#56
0
 public NegationExpression(TokenPosition position, Expression value) : base(position)
 {
     _value = value;
 }
 public OrElseExpression(TokenPosition position, Expression left, Expression right) : base(position, left, right)
 {
 }
示例#58
0
 public MultiplyExpression(TokenPosition position, Expression left, Expression right) : base(position, "*", left, right)
 {
 }
示例#59
0
 public LexerException(string message, TokenPosition position, string token, Exception innerException) : base(message, innerException)
 {
     Position = position;
     Token = token;
 }
示例#60
0
 public static ValueExpression <T> Value <T>(TokenPosition position, T value)
 {
     return(new ValueExpression <T>(position, value));
 }