public Expression(int beginPoint, int length, ExpressionLine line) { this.beginPoint = beginPoint; this.length = length; this.line = line; this.line.Expressions.Add(this); }
/// <summary> /// Expressões contidas. /// </summary> public ContainerExpression(int beginPos, char character, ExpressionLine line) { _beginPos = beginPos; ContainerChar = character; _line = line; }
public SpecialContainerExpression(int beginPoint, int length, ExpressionLine line, string command, char containerChar) : base(beginPoint, length, line, command) { this.Token = TokenID.StringLiteral; this.containerChar = containerChar; }
/// <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); }
public TabExpression(int beginPoint, ExpressionLine line, string command) : base(beginPoint, 1, line, command) { }
public Expression(int beginPoint, ExpressionLine line, char command) : this(beginPoint, 1, line) { this.text = new string(command, 1); }
public Expression(int beginPoint, int length, ExpressionLine line, string command, TokenID token) : this(beginPoint, length, line) { this.text = command.Substring(beginPoint, length); _token = token; }
public Expression(int beginPoint, int length, ExpressionLine line, string command) : this(beginPoint, length, line, command, TokenID.Identifier) { this.text = command.Substring(beginPoint, length); }