コード例 #1
0
 public Expression(int beginPoint, int length, ExpressionLine line)
 {
     this.beginPoint = beginPoint;
     this.length     = length;
     this.line       = line;
     this.line.Expressions.Add(this);
 }
コード例 #2
0
 /// <summary>
 /// Expressões contidas.
 /// </summary>
 public ContainerExpression(int beginPos, char character, ExpressionLine line)
 {
     _beginPos     = beginPos;
     ContainerChar = character;
     _line         = line;
 }
コード例 #3
0
 public SpecialContainerExpression(int beginPoint, int length, ExpressionLine line, string command, char containerChar) : base(beginPoint, length, line, command)
 {
     this.Token         = TokenID.StringLiteral;
     this.containerChar = containerChar;
 }
コード例 #4
0
ファイル: Lexer.cs プロジェクト: fabrimaciel/gda
        /// <summary>
        /// Executa a análise lexa no comando.
        /// </summary>
        /// <returns></returns>
        internal List <Expression> Lex()
        {
            _lines       = new List <ExpressionLine>();
            _expressions = new List <Expression>();
            Stack <ContainerExpression> cExpressions = new Stack <ContainerExpression>();
            int            beginPos                  = 0;
            int            pos                       = 0;
            State          state                     = State.S0;
            bool           innerContainer            = false;
            char           usingSpecialContainerChar = '\"';
            ExpressionLine lastLine                  = new ExpressionLine(pos);

            _lines.Add(lastLine);
            bool end = false;

            while (!end || (pos == Command.Length && (state == State.S8 || state == State.S3 || state == State.S2)))
            {
                switch (state)
                {
                case State.S0:
                    if (Array.IndexOf <char>(spacesChar, Command[pos]) != -1)
                    {
                        state = State.S0;
                        if (Command[pos] == '\n')
                        {
                            lastLine.Length = pos - lastLine.BeginPoint;
                            lastLine        = new ExpressionLine(pos);
                            _lines.Add(lastLine);
                        }
                        else
                        {
                        }
                        beginPos = pos + 1;
                    }
                    else if (Array.IndexOf <char>(beginStringContainers, Command[pos]) != -1)
                    {
                        beginPos = pos + 1;
                        usingSpecialContainerChar = endStringContainers[Array.IndexOf <char>(beginStringContainers, Command[pos])];
                        state = State.S1;
                    }
                    else if (Array.IndexOf <char>(tabsChar, Command[pos]) != -1)
                    {
                        beginPos = pos;
                        state    = State.S2;
                    }
                    else if (isAlpha(Command[pos]))
                    {
                        state = State.S3;
                    }
                    else if (char.IsDigit(Command[pos]))
                    {
                        state = State.S8;
                    }
                    else if (Array.IndexOf <char>(beginContainers, Command[pos]) != -1)
                    {
                        Expression e = new Expression(pos, lastLine, Command[pos]);
                        switch (Command[pos])
                        {
                        case '(':
                            e.Token = TokenID.LParen;
                            break;

                        case '{':
                            e.Token = TokenID.LCurly;
                            break;
                        }
                        _expressions.Add(e);
                        cExpressions.Push(new ContainerExpression(pos, e.Text[0], lastLine));
                        beginPos       = pos + 1;
                        innerContainer = true;
                        state          = State.S0;
                    }
                    else if (Array.IndexOf <char>(endContainers, Command[pos]) != -1)
                    {
                        if (cExpressions.Count == 0)
                        {
                            throw new SqlLexerException(String.Format("Not open tag for caracter {0}. Line: {1} - Col: {2}.", Command[pos], _lines.Count, pos - lastLine.BeginPoint));
                        }
                        else if (cExpressions.Peek().EndContainerChar == Command[pos])
                        {
                            cExpressions.Pop();
                            Expression e = new Expression(pos, lastLine, Command[pos]);
                            switch (Command[pos])
                            {
                            case ')':
                                e.Token = TokenID.RParen;
                                break;

                            case '}':
                                e.Token = TokenID.RCurly;
                                break;
                            }
                            _expressions.Add(e);
                            if (cExpressions.Count == 0)
                            {
                                innerContainer = false;
                            }
                            beginPos = pos + 1;
                            state    = State.S0;
                        }
                        else
                        {
                            throw new SqlLexerException(String.Format("Expected caracter {0}. Line: {1} - Col: {2}.", cExpressions.Peek().EndContainerChar, _lines.Count, pos - lastLine.BeginPoint));
                        }
                    }
                    else
                    {
                        throw new SqlLexerException(String.Format("Invalid caracter '{0}' in expression context.", Command[pos]));
                    }
                    break;

                case State.S1:
                    if (Command[pos] == usingSpecialContainerChar)
                    {
                        if ((pos > 0 && Command[pos - 1] != '\\') || (pos > 1 && Command[pos - 2] == '\\'))
                        {
                            if (usingSpecialContainerChar == ']' || usingSpecialContainerChar == '`')
                            {
                                Expression e = new Expression(beginPos, pos - beginPos, lastLine, Command, TokenID.Identifier);
                                e.CurrentSpecialContainer = new SpecialContainer(Command[beginPos - 1], Command[pos]);
                                _expressions.Add(e);
                            }
                            else
                            {
                                SpecialContainerExpression sce = new SpecialContainerExpression(beginPos, pos - beginPos, lastLine, Command, usingSpecialContainerChar);
                                _expressions.Add(sce);
                                switch (usingSpecialContainerChar)
                                {
                                case '"':
                                    sce.ContainerToken = TokenID.Quote;
                                    break;

                                case '\'':
                                    sce.ContainerToken = TokenID.SQuote;
                                    break;
                                }
                            }
                            beginPos = pos + 1;
                            state    = State.S0;
                        }
                    }
                    break;

                case State.S2:
                    if (Command[pos - 1] == '-' && char.IsDigit(Command[pos]))
                    {
                        if (Command.Length < 2 || (Command.Length > 2 && Array.IndexOf <char>(tabsChar, Command[pos - 2]) != -1) || (Command.Length > 2 && Array.IndexOf <char>(spacesChar, Command[pos - 2]) != -1))
                        {
                            state = State.S8;
                            continue;
                        }
                    }
                    string join;
                    if (!end)
                    {
                        join = Command[pos - 1].ToString() + Command[pos].ToString();
                    }
                    else
                    {
                        join = Command[pos - 1].ToString();
                    }
                    switch (join)
                    {
                    case "&&":
                    case "||":
                    case "++":
                    case "--":
                    case "->":
                    case "==":
                    case "<>":
                    case "!=":
                    case "!<":
                    case "!>":
                    case ">=":
                    case "<=":
                    case "+=":
                    case "/*":
                    case "*/":
                    case "//":
                    case ":=":
                        Expression e = new Expression(beginPos, 2, lastLine, Command);
                        switch (e.Text)
                        {
                        case "&&":
                            e.Token = TokenID.kAnd;
                            break;

                        case "||":
                            e.Token = TokenID.kOr;
                            break;

                        case "++":
                            e.Token = TokenID.PlusPlus;
                            break;

                        case "--":
                            e.Token = TokenID.MinusMinus;
                            break;

                        case "->":
                            e.Token = TokenID.MinusGreater;
                            break;

                        case ":=":
                            e.Token = TokenID.Equal;
                            break;

                        case "==":
                            e.Token = TokenID.EqualEqual;
                            break;

                        case "<>":
                        case "!=":
                            e.Token = TokenID.NotEqual;
                            break;

                        case ">=":
                            e.Token = TokenID.GreaterEqual;
                            break;

                        case "<=":
                            e.Token = TokenID.LessEqual;
                            break;

                        case "+=":
                            e.Token = TokenID.PlusEqual;
                            break;

                        case "/*":
                            e.Token = TokenID.BMultiComment;
                            break;

                        case "*/":
                            e.Token = TokenID.EMultiComment;
                            break;

                        case "//":
                            e.Token = TokenID.SingleComment;
                            break;

                        case "!>":
                            e.Token = TokenID.Less;
                            break;

                        case "!<":
                            e.Token = TokenID.Greater;
                            break;

                        default:
                            e.Token = TokenID.InvalidTab;
                            break;
                        }
                        _expressions.Add(e);
                        beginPos = pos + 1;
                        state    = State.S0;
                        break;

                    default:
                        TabExpression te = new TabExpression(beginPos, lastLine, Command);
                        switch (Command[beginPos])
                        {
                        case '.':
                            te.Token = TokenID.Dot;
                            break;

                        case '=':
                            te.Token = TokenID.Equal;
                            break;

                        case '"':
                            te.Token = TokenID.Hash;
                            break;

                        case '$':
                            te.Token = TokenID.Dollar;
                            break;

                        case '%':
                            te.Token = TokenID.Percent;
                            break;

                        case '&':
                            te.Token = TokenID.BAnd;
                            break;

                        case '*':
                            te.Token = TokenID.Star;
                            break;

                        case '+':
                            te.Token = TokenID.Plus;
                            break;

                        case '-':
                            te.Token = TokenID.Minus;
                            break;

                        case ',':
                            te.Token = TokenID.Comma;
                            break;

                        case '/':
                            te.Token = TokenID.Slash;
                            break;

                        case ':':
                            te.Token = TokenID.Colon;
                            break;

                        case ';':
                            te.Token = TokenID.Semi;
                            break;

                        case '<':
                            te.Token = TokenID.Less;
                            break;

                        case '>':
                            te.Token = TokenID.Greater;
                            break;

                        case '?':
                            te.Token = TokenID.Question;
                            break;

                        case '!':
                            te.Token = TokenID.kNot;
                            break;

                        default:
                            te.Token = TokenID.InvalidTab;
                            break;
                        }
                        _expressions.Add(te);
                        beginPos = pos;
                        pos--;
                        state = State.S0;
                        break;
                    }
                    break;

                case State.S3:
                    if (pos == Command.Length || !isAlphanumeric(Command[pos]))
                    {
                        Expression e = new Expression(beginPos, pos - beginPos, lastLine, Command);
                        if (char.IsDigit(e.Text[0]) || e.Text[0] == '-')
                        {
                            if (e.Text.Length > 2 && (e.Text[1] == 'x' || e.Text[1] == 'X') && System.Text.RegularExpressions.Regex.IsMatch(e.Text.Substring(2), "[0-9]"))
                            {
                                e.Token = TokenID.HexLiteral;
                            }
                            else if (System.Text.RegularExpressions.Regex.IsMatch(e.Text, "^([-]|[0-9])[0-9]*$"))
                            {
                                e.Token = TokenID.IntLiteral;
                            }
                            else if (System.Text.RegularExpressions.Regex.IsMatch(e.Text, "^([-]|[.]|[-.]|[0-9])[0-9]*[.]*[0-9]+$"))
                            {
                                e.Token = TokenID.RealLiteral;
                            }
                        }
                        else if (keywords.ContainsKey(e.Text.ToLower()))
                        {
                            e.Token = keywords[e.Text.ToLower()];
                        }
                        else
                        {
                            e.Token = TokenID.Identifier;
                        }
                        _expressions.Add(e);
                        beginPos = pos;
                        pos--;
                        state = State.S0;
                    }
                    break;

                case State.S8:
                    if (pos == Command.Length || !isNumeric(Command[pos]))
                    {
                        Expression e = new Expression(beginPos, pos - beginPos, lastLine, Command);
                        if (e.Text.Length > 2 && (e.Text[1] == 'x' || e.Text[1] == 'X') && System.Text.RegularExpressions.Regex.IsMatch(e.Text.Substring(2), "[0-9]"))
                        {
                            e.Token = TokenID.HexLiteral;
                        }
                        else if (System.Text.RegularExpressions.Regex.IsMatch(e.Text, "[0-9]"))
                        {
                            e.Token = TokenID.IntLiteral;
                        }
                        else if (System.Text.RegularExpressions.Regex.IsMatch(e.Text, "^([-]|[.]|[-.]|[0-9])[0-9]*[.]*[0-9]+$"))
                        {
                            e.Token = TokenID.RealLiteral;
                        }
                        else
                        {
                            throw new SqlLexerException("Expected number or hexadecimal.");
                        }
                        _expressions.Add(e);
                        beginPos = pos;
                        pos--;
                        state = State.S0;
                    }
                    break;
                }
                pos++;
                end = (pos == Command.Length);
            }
            lastLine.Length = pos - lastLine.BeginPoint;
            if (state != State.S0)
            {
                throw new SqlLexerException("Invalid expression.");
            }
            if (cExpressions.Count > 0)
            {
                throw new SqlLexerException(String.Format("{0} expected. Line: {1} - Col: {2} -- opened in Line: {3} - Col: {4}", cExpressions.Peek().EndContainerChar, _lines.Count, lastLine.Length, cExpressions.Peek().Line.BeginPoint, cExpressions.Peek().BeginPos));
            }
            return(_expressions);
        }
コード例 #5
0
ファイル: TabExpression.cs プロジェクト: fabrimaciel/gda
 public TabExpression(int beginPoint, ExpressionLine line, string command) : base(beginPoint, 1, line, command)
 {
 }
コード例 #6
0
 public Expression(int beginPoint, ExpressionLine line, char command) : this(beginPoint, 1, line)
 {
     this.text = new string(command, 1);
 }
コード例 #7
0
 public Expression(int beginPoint, int length, ExpressionLine line, string command, TokenID token) : this(beginPoint, length, line)
 {
     this.text = command.Substring(beginPoint, length);
     _token    = token;
 }
コード例 #8
0
 public Expression(int beginPoint, int length, ExpressionLine line, string command) : this(beginPoint, length, line, command, TokenID.Identifier)
 {
     this.text = command.Substring(beginPoint, length);
 }