mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2026-02-09 09:16:41 +08:00
Implement tokenization of relational operators
--HG-- branch : dev
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user