Implement tokenization of relational operators

--HG--
branch : dev
This commit is contained in:
Renaud Paquay
2010-11-28 16:18:00 -08:00
parent 2d5b2bb20c
commit ffe6c88038
4 changed files with 68 additions and 3 deletions

View File

@@ -61,6 +61,12 @@ namespace Orchard.Tests.Modules.Scripting {
CheckTokenSequence("1+2*3", TokenKind.Integer, TokenKind.Plus, TokenKind.Integer, TokenKind.Mul, TokenKind.Integer); CheckTokenSequence("1+2*3", TokenKind.Integer, TokenKind.Plus, TokenKind.Integer, TokenKind.Mul, TokenKind.Integer);
} }
[Test]
public void LexerShouldProcesSequenceOfTokens3() {
CheckTokenSequence("= == < <= > >= ! !=", TokenKind.Equal, TokenKind.EqualEqual,
TokenKind.LessThan, TokenKind.LessThanEqual,
TokenKind.GreaterThan, TokenKind.GreaterThanEqual, TokenKind.NotSign, TokenKind.NotEqual);
}
private void CheckTokenSequence(string expression, params TokenKind[] tokenKinds) { private void CheckTokenSequence(string expression, params TokenKind[] tokenKinds) {
var lexer = new Tokenizer(expression); var lexer = new Tokenizer(expression);

View File

@@ -7,7 +7,10 @@ namespace Orchard.Scripting.Compiler {
public object Value { get; set; } public object Value { get; set; }
public override string ToString() { public override string ToString() {
return String.Format("{0} ({1}) at position {2}", Kind, Value ?? "<noval>", Position); if (Value == null)
return String.Format("Token {0} at position {1}", Kind, Position);
else
return String.Format("Token {0} ({1}) at position {2}", Kind, Value, Position);
} }
} }
} }

View File

@@ -1,10 +1,12 @@
namespace Orchard.Scripting.Compiler { namespace Orchard.Scripting.Compiler {
public enum TokenKind { public enum TokenKind {
Invalid,
Eof, Eof,
OpenParen, OpenParen,
CloseParen, CloseParen,
StringLiteral, StringLiteral,
SingleQuotedStringLiteral, SingleQuotedStringLiteral,
Identifier,
Integer, Integer,
Comma, Comma,
Plus, Plus,
@@ -13,10 +15,16 @@
Div, Div,
True, True,
False, False,
Identifier,
And, And,
Or, Or,
Not, Not,
Invalid Equal,
EqualEqual,
NotSign,
NotEqual,
LessThan,
LessThanEqual,
GreaterThan,
GreaterThanEqual
} }
} }

View File

@@ -46,6 +46,14 @@ namespace Orchard.Scripting.Compiler {
return LexStringLiteral(); return LexStringLiteral();
case '\'': case '\'':
return LexSingleQuotedStringLiteral(); return LexSingleQuotedStringLiteral();
case '!':
return LexNotSign();
case '=':
return LexEqual();
case '<':
return LexLessThan();
case '>':
return LexGreaterThan();
} }
if (IsDigitCharacter(ch)) { if (IsDigitCharacter(ch)) {
@@ -63,6 +71,46 @@ namespace Orchard.Scripting.Compiler {
} }
} }
private Token LexNotSign() {
NextCharacter();
char ch = Character();
if (ch == '=') {
NextCharacter();
return CreateToken(TokenKind.NotEqual);
}
return CreateToken(TokenKind.NotSign);
}
private Token LexGreaterThan() {
NextCharacter();
char ch = Character();
if (ch == '=') {
NextCharacter();
return CreateToken(TokenKind.GreaterThanEqual);
}
return CreateToken(TokenKind.GreaterThan);
}
private Token LexLessThan() {
NextCharacter();
char ch = Character();
if (ch == '=') {
NextCharacter();
return CreateToken(TokenKind.LessThanEqual);
}
return CreateToken(TokenKind.LessThan);
}
private Token LexEqual() {
NextCharacter();
char ch = Character();
if (ch == '=') {
NextCharacter();
return CreateToken(TokenKind.EqualEqual);
}
return CreateToken(TokenKind.Equal);
}
private Token LexIdentifierOrKeyword() { private Token LexIdentifierOrKeyword() {
_stringBuilder.Clear(); _stringBuilder.Clear();