From 289ba2ff5e8f1a6be0eec69b19ebebbb6b1ff27a Mon Sep 17 00:00:00 2001 From: Renaud Paquay Date: Sat, 27 Nov 2010 17:56:32 -0800 Subject: [PATCH] More renames and re-org --HG-- branch : dev rename : src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/AbstractSyntaxTree.cs => src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Ast/AbstractSyntaxTree.cs rename : src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/AstNode.cs => src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Ast/AstNode.cs rename : src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/BinaryAstNode.cs => src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Ast/BinaryAstNode.cs rename : src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/ConstantAstNode.cs => src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Ast/ConstantAstNode.cs rename : src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/ErrorAstNode.cs => src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Ast/ErrorAstNode.cs rename : src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/IAstNodeWithToken.cs => src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Ast/IAstNodeWithToken.cs rename : src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/UnaryAstNode.cs => src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Ast/UnaryAstNode.cs rename : src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Lexer.cs => src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Compiler/Lexer.cs rename : src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Parser.cs => src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Compiler/Parser.cs rename : src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Terminal.cs => src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Compiler/Token.cs rename : src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/TerminalKind.cs => src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Compiler/TokenKind.cs rename : src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Tokenizer.cs => src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Compiler/Tokenizer.cs --- .../SimpleScripting/EvaluatorTests.cs | 1 + .../SimpleScripting/ParserTests.cs | 36 +++++------ .../SimpleScripting/TokenizerTests.cs | 51 ++++++++-------- .../Orchard.Widgets/Orchard.Widgets.csproj | 24 ++++---- .../{ => Ast}/AbstractSyntaxTree.cs | 2 +- .../SimpleScripting/{ => Ast}/AstNode.cs | 4 +- .../{ => Ast}/BinaryAstNode.cs | 17 +++--- .../SimpleScripting/Ast/ConstantAstNode.cs | 17 ++++++ .../SimpleScripting/{ => Ast}/ErrorAstNode.cs | 13 ++-- .../SimpleScripting/Ast/IAstNodeWithToken.cs | 7 +++ .../SimpleScripting/Ast/UnaryAstNode.cs | 29 +++++++++ .../SimpleScripting/{ => Compiler}/Lexer.cs | 6 +- .../SimpleScripting/{ => Compiler}/Parser.cs | 56 ++++++++--------- .../{Terminal.cs => Compiler/Token.cs} | 6 +- .../TokenKind.cs} | 4 +- .../{ => Compiler}/Tokenizer.cs | 60 +++++++++---------- .../SimpleScripting/ConstantAstNode.cs | 15 ----- .../SimpleScripting/IAstNodeWithToken.cs | 5 -- .../SimpleScripting/ScriptingManager.cs | 2 + .../SimpleScripting/UnaryAstNode.cs | 28 --------- 20 files changed, 198 insertions(+), 185 deletions(-) rename src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/{ => Ast}/AbstractSyntaxTree.cs (61%) rename src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/{ => Ast}/AstNode.cs (83%) rename src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/{ => Ast}/BinaryAstNode.cs (52%) create mode 100644 src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Ast/ConstantAstNode.cs rename src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/{ => Ast}/ErrorAstNode.cs (55%) create mode 100644 src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Ast/IAstNodeWithToken.cs create mode 100644 src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Ast/UnaryAstNode.cs rename src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/{ => Compiler}/Lexer.cs (83%) rename src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/{ => Compiler}/Parser.cs (70%) rename src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/{Terminal.cs => Compiler/Token.cs} (66%) rename src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/{TerminalKind.cs => Compiler/TokenKind.cs} (73%) rename src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/{ => Compiler}/Tokenizer.cs (68%) delete mode 100644 src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/ConstantAstNode.cs delete mode 100644 src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/IAstNodeWithToken.cs delete mode 100644 src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/UnaryAstNode.cs diff --git a/src/Orchard.Tests.Modules/SimpleScripting/EvaluatorTests.cs b/src/Orchard.Tests.Modules/SimpleScripting/EvaluatorTests.cs index b20e238ef..aaab2a8b9 100644 --- a/src/Orchard.Tests.Modules/SimpleScripting/EvaluatorTests.cs +++ b/src/Orchard.Tests.Modules/SimpleScripting/EvaluatorTests.cs @@ -1,5 +1,6 @@ using NUnit.Framework; using Orchard.Widgets.SimpleScripting; +using Orchard.Widgets.SimpleScripting.Compiler; namespace Orchard.Tests.Modules.SimpleScriptingTests { [TestFixture] diff --git a/src/Orchard.Tests.Modules/SimpleScripting/ParserTests.cs b/src/Orchard.Tests.Modules/SimpleScripting/ParserTests.cs index db7799788..86480a851 100644 --- a/src/Orchard.Tests.Modules/SimpleScripting/ParserTests.cs +++ b/src/Orchard.Tests.Modules/SimpleScripting/ParserTests.cs @@ -2,6 +2,8 @@ using System.Diagnostics; using NUnit.Framework; using Orchard.Widgets.SimpleScripting; +using Orchard.Widgets.SimpleScripting.Ast; +using Orchard.Widgets.SimpleScripting.Compiler; namespace Orchard.Tests.Modules.SimpleScriptingTests { [TestFixture] @@ -18,7 +20,7 @@ namespace Orchard.Tests.Modules.SimpleScriptingTests { public void ParserShouldUnderstandBinaryExpressions() { var tree = new Parser("true+true").Parse(); CheckTree(tree, new object[] { - "binop", TerminalKind.Plus, + "binop", TokenKind.Plus, "const", true, "const", true, }); @@ -28,9 +30,9 @@ namespace Orchard.Tests.Modules.SimpleScriptingTests { public void ParserShouldUnderstandOperatorPrecedence() { var tree = new Parser("1+2*3").Parse(); CheckTree(tree, new object[] { - "binop", TerminalKind.Plus, + "binop", TokenKind.Plus, "const", 1, - "binop", TerminalKind.Mul, + "binop", TokenKind.Mul, "const", 2, "const", 3, }); @@ -40,8 +42,8 @@ namespace Orchard.Tests.Modules.SimpleScriptingTests { public void ParserShouldUnderstandOperatorPrecedence2() { var tree = new Parser("1*2+3").Parse(); CheckTree(tree, new object[] { - "binop", TerminalKind.Plus, - "binop", TerminalKind.Mul, + "binop", TokenKind.Plus, + "binop", TokenKind.Mul, "const", 1, "const", 2, "const", 3, @@ -52,8 +54,8 @@ namespace Orchard.Tests.Modules.SimpleScriptingTests { public void ParserShouldUnderstandOperatorPrecedence3() { var tree = new Parser("not true or true").Parse(); CheckTree(tree, new object[] { - "binop", TerminalKind.Or, - "unop", TerminalKind.Not, + "binop", TokenKind.Or, + "unop", TokenKind.Not, "const", true, "const", true, }); @@ -63,8 +65,8 @@ namespace Orchard.Tests.Modules.SimpleScriptingTests { public void ParserShouldUnderstandOperatorPrecedence4() { var tree = new Parser("not (true or true)").Parse(); CheckTree(tree, new object[] { - "unop", TerminalKind.Not, - "binop", TerminalKind.Or, + "unop", TokenKind.Not, + "binop", TokenKind.Or, "const", true, "const", true, }); @@ -74,9 +76,9 @@ namespace Orchard.Tests.Modules.SimpleScriptingTests { public void ParserShouldUnderstandParenthesis() { var tree = new Parser("1*(2+3)").Parse(); CheckTree(tree, new object[] { - "binop", TerminalKind.Mul, + "binop", TokenKind.Mul, "const", 1, - "binop", TerminalKind.Plus, + "binop", TokenKind.Plus, "const", 2, "const", 3, }); @@ -86,13 +88,13 @@ namespace Orchard.Tests.Modules.SimpleScriptingTests { public void ParserShouldUnderstandComplexExpressions() { var tree = new Parser("not 1 * (2 / 4 * 6 + (3))").Parse(); CheckTree(tree, new object[] { - "unop", TerminalKind.Not, - "binop", TerminalKind.Mul, + "unop", TokenKind.Not, + "binop", TokenKind.Mul, "const", 1, - "binop", TerminalKind.Plus, - "binop", TerminalKind.Div, + "binop", TokenKind.Plus, + "binop", TokenKind.Div, "const", 2, - "binop", TerminalKind.Mul, + "binop", TokenKind.Mul, "const", 4, "const", 6, "const", 3, @@ -103,7 +105,7 @@ namespace Orchard.Tests.Modules.SimpleScriptingTests { public void ParserShouldContainErrorExpressions() { var tree = new Parser("1 + not 3").Parse(); CheckTree(tree, new object[] { - "binop", TerminalKind.Plus, + "binop", TokenKind.Plus, "const", 1, "error", }); diff --git a/src/Orchard.Tests.Modules/SimpleScripting/TokenizerTests.cs b/src/Orchard.Tests.Modules/SimpleScripting/TokenizerTests.cs index 0a8d127b1..8504b453b 100644 --- a/src/Orchard.Tests.Modules/SimpleScripting/TokenizerTests.cs +++ b/src/Orchard.Tests.Modules/SimpleScripting/TokenizerTests.cs @@ -1,5 +1,6 @@ using NUnit.Framework; using Orchard.Widgets.SimpleScripting; +using Orchard.Widgets.SimpleScripting.Compiler; namespace Orchard.Tests.Modules.SimpleScriptingTests { [TestFixture] @@ -7,70 +8,70 @@ namespace Orchard.Tests.Modules.SimpleScriptingTests { [Test] public void LexerShouldProcessSingleQuotedStringLiteral() { - TestStringLiteral(@"'toto'", @"toto", TerminalKind.SingleQuotedStringLiteral); - TestStringLiteral(@"'to\'to'", @"to'to", TerminalKind.SingleQuotedStringLiteral); - TestStringLiteral(@"'to\\to'", @"to\to", TerminalKind.SingleQuotedStringLiteral); - TestStringLiteral(@"'to\ato'", @"to\ato", TerminalKind.SingleQuotedStringLiteral); + TestStringLiteral(@"'toto'", @"toto", TokenKind.SingleQuotedStringLiteral); + TestStringLiteral(@"'to\'to'", @"to'to", TokenKind.SingleQuotedStringLiteral); + TestStringLiteral(@"'to\\to'", @"to\to", TokenKind.SingleQuotedStringLiteral); + TestStringLiteral(@"'to\ato'", @"to\ato", TokenKind.SingleQuotedStringLiteral); } [Test] public void LexerShouldProcessStringLiteral() { - TestStringLiteral(@"""toto""", @"toto", TerminalKind.StringLiteral); - TestStringLiteral(@"""to\'to""", @"to'to", TerminalKind.StringLiteral); - TestStringLiteral(@"""to\\to""", @"to\to", TerminalKind.StringLiteral); - TestStringLiteral(@"""to\ato""", @"toato", TerminalKind.StringLiteral); + TestStringLiteral(@"""toto""", @"toto", TokenKind.StringLiteral); + TestStringLiteral(@"""to\'to""", @"to'to", TokenKind.StringLiteral); + TestStringLiteral(@"""to\\to""", @"to\to", TokenKind.StringLiteral); + TestStringLiteral(@"""to\ato""", @"toato", TokenKind.StringLiteral); } - private void TestStringLiteral(string value, string expected, TerminalKind expectedTerminalKind) { + private void TestStringLiteral(string value, string expected, TokenKind expectedTokenKind) { var lexer = new Tokenizer(value); var token1 = lexer.NextToken(); - Assert.That(token1.Kind, Is.EqualTo(expectedTerminalKind)); + Assert.That(token1.Kind, Is.EqualTo(expectedTokenKind)); Assert.That(token1.Value, Is.EqualTo(expected)); var token2 = lexer.NextToken(); - Assert.That(token2.Kind, Is.EqualTo(TerminalKind.Eof)); + Assert.That(token2.Kind, Is.EqualTo(TokenKind.Eof)); } [Test] public void LexerShouldProcessReservedWords() { - TestReservedWord("true", true, TerminalKind.True); - TestReservedWord("false", false, TerminalKind.False); - TestReservedWord("not", null, TerminalKind.Not); - TestReservedWord("and", null, TerminalKind.And); - TestReservedWord("or", null, TerminalKind.Or); + TestReservedWord("true", true, TokenKind.True); + TestReservedWord("false", false, TokenKind.False); + TestReservedWord("not", null, TokenKind.Not); + TestReservedWord("and", null, TokenKind.And); + TestReservedWord("or", null, TokenKind.Or); } - private void TestReservedWord(string expression, object value, TerminalKind expectedTerminalKind) { + private void TestReservedWord(string expression, object value, TokenKind expectedTokenKind) { var lexer = new Tokenizer(expression); var token1 = lexer.NextToken(); - Assert.That(token1.Kind, Is.EqualTo(expectedTerminalKind)); + Assert.That(token1.Kind, Is.EqualTo(expectedTokenKind)); Assert.That(token1.Value, Is.EqualTo(value)); var token2 = lexer.NextToken(); - Assert.That(token2.Kind, Is.EqualTo(TerminalKind.Eof)); + Assert.That(token2.Kind, Is.EqualTo(TokenKind.Eof)); } [Test] public void LexerShouldProcesSequenceOfTokens() { - CheckTokenSequence("true false", TerminalKind.True, TerminalKind.False); - CheckTokenSequence("true toto false", TerminalKind.True, TerminalKind.Identifier, TerminalKind.False); + CheckTokenSequence("true false", TokenKind.True, TokenKind.False); + CheckTokenSequence("true toto false", TokenKind.True, TokenKind.Identifier, TokenKind.False); } [Test] public void LexerShouldProcesSequenceOfTokens2() { - CheckTokenSequence("1+2*3", TerminalKind.Integer, TerminalKind.Plus, TerminalKind.Integer, TerminalKind.Mul, TerminalKind.Integer); + CheckTokenSequence("1+2*3", TokenKind.Integer, TokenKind.Plus, TokenKind.Integer, TokenKind.Mul, TokenKind.Integer); } - private void CheckTokenSequence(string expression, params TerminalKind[] terminalKinds) { + private void CheckTokenSequence(string expression, params TokenKind[] tokenKinds) { var lexer = new Tokenizer(expression); - foreach (var kind in terminalKinds) { + foreach (var kind in tokenKinds) { var token = lexer.NextToken(); Assert.That(token.Kind, Is.EqualTo(kind)); } var token2 = lexer.NextToken(); - Assert.That(token2.Kind, Is.EqualTo(TerminalKind.Eof)); + Assert.That(token2.Kind, Is.EqualTo(TokenKind.Eof)); } } } diff --git a/src/Orchard.Web/Modules/Orchard.Widgets/Orchard.Widgets.csproj b/src/Orchard.Web/Modules/Orchard.Widgets/Orchard.Widgets.csproj index a377ed006..b3988b07f 100644 --- a/src/Orchard.Web/Modules/Orchard.Widgets/Orchard.Widgets.csproj +++ b/src/Orchard.Web/Modules/Orchard.Widgets/Orchard.Widgets.csproj @@ -75,19 +75,19 @@ - - - - - - - - - + + + + + + + + + - - - + + + diff --git a/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/AbstractSyntaxTree.cs b/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Ast/AbstractSyntaxTree.cs similarity index 61% rename from src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/AbstractSyntaxTree.cs rename to src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Ast/AbstractSyntaxTree.cs index db56fa4cc..a064c322c 100644 --- a/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/AbstractSyntaxTree.cs +++ b/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Ast/AbstractSyntaxTree.cs @@ -1,4 +1,4 @@ -namespace Orchard.Widgets.SimpleScripting { +namespace Orchard.Widgets.SimpleScripting.Ast { public class AbstractSyntaxTree { public AstNode Root { get; set; } } diff --git a/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/AstNode.cs b/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Ast/AstNode.cs similarity index 83% rename from src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/AstNode.cs rename to src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Ast/AstNode.cs index 5fc73fbc3..284e0af36 100644 --- a/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/AstNode.cs +++ b/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Ast/AstNode.cs @@ -2,7 +2,7 @@ using System.Linq; using System.Text; -namespace Orchard.Widgets.SimpleScripting { +namespace Orchard.Widgets.SimpleScripting.Ast { public class AstNode { public virtual IEnumerable Children { get { @@ -16,7 +16,7 @@ namespace Orchard.Widgets.SimpleScripting { var ewt = (this as IAstNodeWithToken); if (ewt != null) { sb.Append(" - "); - sb.Append(ewt.Terminal); + sb.Append(ewt.Token); } return sb.ToString(); } diff --git a/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/BinaryAstNode.cs b/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Ast/BinaryAstNode.cs similarity index 52% rename from src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/BinaryAstNode.cs rename to src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Ast/BinaryAstNode.cs index 51d359e8a..48c155132 100644 --- a/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/BinaryAstNode.cs +++ b/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Ast/BinaryAstNode.cs @@ -1,23 +1,24 @@ using System.Collections.Generic; +using Orchard.Widgets.SimpleScripting.Compiler; -namespace Orchard.Widgets.SimpleScripting { +namespace Orchard.Widgets.SimpleScripting.Ast { public class BinaryAstNode : AstNode, IAstNodeWithToken { private readonly AstNode _left; - private readonly Terminal _terminal; + private readonly Token _token; private readonly AstNode _right; - public BinaryAstNode(AstNode left, Terminal terminal, AstNode right) { + public BinaryAstNode(AstNode left, Token token, AstNode right) { _left = left; - _terminal = terminal; + _token = token; _right = right; } - public Terminal Terminal { - get { return _terminal; } + public Token Token { + get { return _token; } } - public Terminal Operator { - get { return _terminal; } + public Token Operator { + get { return _token; } } public override IEnumerable Children { diff --git a/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Ast/ConstantAstNode.cs b/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Ast/ConstantAstNode.cs new file mode 100644 index 000000000..960c8189c --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Ast/ConstantAstNode.cs @@ -0,0 +1,17 @@ +using Orchard.Widgets.SimpleScripting.Compiler; + +namespace Orchard.Widgets.SimpleScripting.Ast { + public class ConstantAstNode : AstNode, IAstNodeWithToken { + private readonly Token _token; + + public ConstantAstNode(Token token) { + _token = token; + } + + public Token Token { + get { return _token; } + } + + public object Value { get { return _token.Value; } } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/ErrorAstNode.cs b/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Ast/ErrorAstNode.cs similarity index 55% rename from src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/ErrorAstNode.cs rename to src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Ast/ErrorAstNode.cs index e24bcfc64..51406c8e4 100644 --- a/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/ErrorAstNode.cs +++ b/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Ast/ErrorAstNode.cs @@ -1,17 +1,18 @@ using System; +using Orchard.Widgets.SimpleScripting.Compiler; -namespace Orchard.Widgets.SimpleScripting { +namespace Orchard.Widgets.SimpleScripting.Ast { public class ErrorAstNode : AstNode, IAstNodeWithToken { - private readonly Terminal _terminal; + private readonly Token _token; private readonly string _message; - public ErrorAstNode(Terminal terminal, string message) { - _terminal = terminal; + public ErrorAstNode(Token token, string message) { + _token = token; _message = message; } - public Terminal Terminal { - get { return _terminal; } + public Token Token { + get { return _token; } } public string Message { diff --git a/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Ast/IAstNodeWithToken.cs b/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Ast/IAstNodeWithToken.cs new file mode 100644 index 000000000..6321d1f5d --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Ast/IAstNodeWithToken.cs @@ -0,0 +1,7 @@ +using Orchard.Widgets.SimpleScripting.Compiler; + +namespace Orchard.Widgets.SimpleScripting.Ast { + public interface IAstNodeWithToken { + Token Token { get; } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Ast/UnaryAstNode.cs b/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Ast/UnaryAstNode.cs new file mode 100644 index 000000000..8899827d1 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Ast/UnaryAstNode.cs @@ -0,0 +1,29 @@ +using System.Collections.Generic; +using Orchard.Widgets.SimpleScripting.Compiler; + +namespace Orchard.Widgets.SimpleScripting.Ast { + public class UnaryAstNode : AstNode, IAstNodeWithToken { + private readonly AstNode _expr; + private readonly Token _token; + + public UnaryAstNode(AstNode expr, Token token) { + _expr = expr; + _token = token; + } + + public Token Token { + get { return _token; } + } + + + public Token Operator { + get { return _token; } + } + + public override IEnumerable Children { + get { + yield return _expr; + } + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Lexer.cs b/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Compiler/Lexer.cs similarity index 83% rename from src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Lexer.cs rename to src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Compiler/Lexer.cs index f0a31e255..6f70710ca 100644 --- a/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Lexer.cs +++ b/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Compiler/Lexer.cs @@ -1,16 +1,16 @@ using System.Collections.Generic; -namespace Orchard.Widgets.SimpleScripting { +namespace Orchard.Widgets.SimpleScripting.Compiler { public class Lexer { private readonly Tokenizer _tokenizer; - private readonly List _tokens= new List(); + private readonly List _tokens= new List(); private int _tokenIndex; public Lexer(Tokenizer tokenizer) { _tokenizer = tokenizer; } - public Terminal Token() { + public Token Token() { if (_tokenIndex == _tokens.Count) { _tokens.Add(_tokenizer.NextToken()); } diff --git a/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Parser.cs b/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Compiler/Parser.cs similarity index 70% rename from src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Parser.cs rename to src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Compiler/Parser.cs index 8ab359a54..79e230629 100644 --- a/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Parser.cs +++ b/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Compiler/Parser.cs @@ -1,7 +1,7 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; +using Orchard.Widgets.SimpleScripting.Ast; -namespace Orchard.Widgets.SimpleScripting { +namespace Orchard.Widgets.SimpleScripting.Compiler { public class Parser { private readonly string _expression; private readonly Lexer _lexer; @@ -28,7 +28,7 @@ namespace Orchard.Widgets.SimpleScripting { private AstNode ParseKeywordOrExpression() { var expr = ParseKeywordAndExpression(); - var token = IsMatch(TerminalKind.Or); + var token = IsMatch(TokenKind.Or); if (token != null) { var right = ParseKeywordOrExpression(); @@ -42,7 +42,7 @@ namespace Orchard.Widgets.SimpleScripting { private AstNode ParseKeywordAndExpression() { var expr = ParseKeywordNotExpression(); - var token = IsMatch(TerminalKind.And); + var token = IsMatch(TokenKind.And); if (token != null) { var right = ParseKeywordAndExpression(); @@ -53,7 +53,7 @@ namespace Orchard.Widgets.SimpleScripting { } private AstNode ParseKeywordNotExpression() { - var token = IsMatch(TerminalKind.Not); + var token = IsMatch(TokenKind.Not); if (token != null) { var expr = ParseKeywordNotExpression(); @@ -66,15 +66,15 @@ namespace Orchard.Widgets.SimpleScripting { private AstNode ParseRelationalExpression() { var expr = ParseAdditiveExpression(); //TODO - //var Terminal = IsMatch(TokenKind.Not); - //if (Terminal != null) { + //var Token = IsMatch(TokenKind.Not); + //if (Token != null) { return expr; } private AstNode ParseAdditiveExpression() { var expr = ParseMultiplicativeExpression(); - var token = IsMatch(TerminalKind.Plus, TerminalKind.Minus); + var token = IsMatch(TokenKind.Plus, TokenKind.Minus); if (token != null) { var right = ParseAdditiveExpression(); @@ -87,7 +87,7 @@ namespace Orchard.Widgets.SimpleScripting { private AstNode ParseMultiplicativeExpression() { var expr = ParseUnaryExpression(); - var token = IsMatch(TerminalKind.Mul, TerminalKind.Div); + var token = IsMatch(TokenKind.Mul, TokenKind.Div); if (token != null) { var right = ParseMultiplicativeExpression(); @@ -105,47 +105,47 @@ namespace Orchard.Widgets.SimpleScripting { private AstNode ParsePrimaryExpression() { var token = _lexer.Token(); switch(_lexer.Token().Kind) { - case TerminalKind.True: - case TerminalKind.False: - case TerminalKind.SingleQuotedStringLiteral: - case TerminalKind.StringLiteral: - case TerminalKind.Integer: + case TokenKind.True: + case TokenKind.False: + case TokenKind.SingleQuotedStringLiteral: + case TokenKind.StringLiteral: + case TokenKind.Integer: return ProduceConstant(token); - case TerminalKind.OpenParen: + case TokenKind.OpenParen: return ParseParenthesizedExpression(); default: return ProduceError(token); } } - private AstNode ProduceConstant(Terminal terminal) { + private AstNode ProduceConstant(Token token) { _lexer.NextToken(); - return new ConstantAstNode(terminal); + return new ConstantAstNode(token); } - private AstNode ProduceError(Terminal terminal) { + private AstNode ProduceError(Token token) { _lexer.NextToken(); - return new ErrorAstNode(terminal, - string.Format("Unexptected Terminal in primary expression ({0})", terminal)); + return new ErrorAstNode(token, + string.Format("Unexptected Token in primary expression ({0})", token)); } private AstNode ParseParenthesizedExpression() { - Match(TerminalKind.OpenParen); + Match(TokenKind.OpenParen); var expr = ParseExpression(); - Match(TerminalKind.CloseParen); + Match(TokenKind.CloseParen); return expr; } - private void Match(TerminalKind kind) { + private void Match(TokenKind kind) { var token = _lexer.Token(); if (token.Kind == kind) { _lexer.NextToken(); return; } - AddError(token, string.Format("Expected Terminal {0}", kind)); + AddError(token, string.Format("Expected Token {0}", kind)); } - private Terminal IsMatch(TerminalKind kind) { + private Token IsMatch(TokenKind kind) { var token = _lexer.Token(); if (token.Kind == kind) { _lexer.NextToken(); @@ -154,7 +154,7 @@ namespace Orchard.Widgets.SimpleScripting { return null; } - private Terminal IsMatch(TerminalKind kind, TerminalKind kind2) { + private Token IsMatch(TokenKind kind, TokenKind kind2) { var token = _lexer.Token(); if (token.Kind == kind || token.Kind == kind2) { _lexer.NextToken(); @@ -163,7 +163,7 @@ namespace Orchard.Widgets.SimpleScripting { return null; } - private void AddError(Terminal terminal, string message) { + private void AddError(Token token, string message) { _errors.Add(message); } } diff --git a/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Terminal.cs b/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Compiler/Token.cs similarity index 66% rename from src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Terminal.cs rename to src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Compiler/Token.cs index 2801f35f3..7514ece05 100644 --- a/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Terminal.cs +++ b/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Compiler/Token.cs @@ -1,8 +1,8 @@ using System; -namespace Orchard.Widgets.SimpleScripting { - public class Terminal { - public TerminalKind Kind { get; set; } +namespace Orchard.Widgets.SimpleScripting.Compiler { + public class Token { + public TokenKind Kind { get; set; } public int Position { get; set; } public object Value { get; set; } diff --git a/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/TerminalKind.cs b/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Compiler/TokenKind.cs similarity index 73% rename from src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/TerminalKind.cs rename to src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Compiler/TokenKind.cs index c2ad6e3a7..0e6f3023b 100644 --- a/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/TerminalKind.cs +++ b/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Compiler/TokenKind.cs @@ -1,5 +1,5 @@ -namespace Orchard.Widgets.SimpleScripting { - public enum TerminalKind { +namespace Orchard.Widgets.SimpleScripting.Compiler { + public enum TokenKind { Eof, OpenParen, CloseParen, diff --git a/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Tokenizer.cs b/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Compiler/Tokenizer.cs similarity index 68% rename from src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Tokenizer.cs rename to src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Compiler/Tokenizer.cs index dc5d77d0c..2d069154e 100644 --- a/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Tokenizer.cs +++ b/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/Compiler/Tokenizer.cs @@ -1,7 +1,7 @@ using System; using System.Text; -namespace Orchard.Widgets.SimpleScripting { +namespace Orchard.Widgets.SimpleScripting.Compiler { public class Tokenizer { private readonly string _expression; private readonly StringBuilder _stringBuilder; @@ -13,9 +13,9 @@ namespace Orchard.Widgets.SimpleScripting { _stringBuilder = new StringBuilder(); } - public Terminal NextToken() { + public Token NextToken() { if (Eof()) - return CreateToken(TerminalKind.Eof); + return CreateToken(TokenKind.Eof); LexAgain: _startTokenIndex = _index; @@ -23,22 +23,22 @@ namespace Orchard.Widgets.SimpleScripting { switch (ch) { case '(': NextCharacter(); - return CreateToken(TerminalKind.OpenParen); + return CreateToken(TokenKind.OpenParen); case ')': NextCharacter(); - return CreateToken(TerminalKind.CloseParen); + return CreateToken(TokenKind.CloseParen); case '+': NextCharacter(); - return CreateToken(TerminalKind.Plus); + return CreateToken(TokenKind.Plus); case '-': NextCharacter(); - return CreateToken(TerminalKind.Minus); + return CreateToken(TokenKind.Minus); case '*': NextCharacter(); - return CreateToken(TerminalKind.Mul); + return CreateToken(TokenKind.Mul); case '/': NextCharacter(); - return CreateToken(TerminalKind.Div); + return CreateToken(TokenKind.Div); case '"': return LexStringLiteral(); case '\'': @@ -56,10 +56,10 @@ namespace Orchard.Widgets.SimpleScripting { goto LexAgain; } - return CreateToken(TerminalKind.Invalid, "Unrecognized character"); + return CreateToken(TokenKind.Invalid, "Unrecognized character"); } - private Terminal LexIdentifierOrKeyword() { + private Token LexIdentifierOrKeyword() { _stringBuilder.Clear(); _stringBuilder.Append(Character()); @@ -75,7 +75,7 @@ namespace Orchard.Widgets.SimpleScripting { } } - private Terminal LexInteger() { + private Token LexInteger() { _stringBuilder.Clear(); _stringBuilder.Append(Character()); @@ -86,25 +86,25 @@ namespace Orchard.Widgets.SimpleScripting { _stringBuilder.Append(Character()); } else { - return CreateToken(TerminalKind.Integer, Int32.Parse(_stringBuilder.ToString())); + return CreateToken(TokenKind.Integer, Int32.Parse(_stringBuilder.ToString())); } } } - private Terminal CreateIdentiferOrKeyword(string identifier) { + private Token CreateIdentiferOrKeyword(string identifier) { switch (identifier) { case "true": - return CreateToken(TerminalKind.True, true); + return CreateToken(TokenKind.True, true); case "false": - return CreateToken(TerminalKind.False, false); + return CreateToken(TokenKind.False, false); case "or": - return CreateToken(TerminalKind.Or, null); + return CreateToken(TokenKind.Or, null); case "and": - return CreateToken(TerminalKind.And, null); + return CreateToken(TokenKind.And, null); case "not": - return CreateToken(TerminalKind.Not, null); + return CreateToken(TokenKind.Not, null); default: - return CreateToken(TerminalKind.Identifier, identifier); + return CreateToken(TokenKind.Identifier, identifier); } } @@ -123,26 +123,26 @@ namespace Orchard.Widgets.SimpleScripting { return ch >= '0' && ch <= '9'; } - private Terminal LexSingleQuotedStringLiteral() { + private Token LexSingleQuotedStringLiteral() { _stringBuilder.Clear(); while (true) { NextCharacter(); if (Eof()) - return CreateToken(TerminalKind.Invalid, "Unterminated string literal"); + return CreateToken(TokenKind.Invalid, "Unterminated string literal"); // Termination if (Character() == '\'') { NextCharacter(); - return CreateToken(TerminalKind.SingleQuotedStringLiteral, _stringBuilder.ToString()); + return CreateToken(TokenKind.SingleQuotedStringLiteral, _stringBuilder.ToString()); } // backslash notation else if (Character() == '\\') { NextCharacter(); if (Eof()) - return CreateToken(TerminalKind.Invalid, "Unterminated string literal"); + return CreateToken(TokenKind.Invalid, "Unterminated string literal"); if (Character() == '\\') { _stringBuilder.Append('\\'); @@ -162,26 +162,26 @@ namespace Orchard.Widgets.SimpleScripting { } } - private Terminal LexStringLiteral() { + private Token LexStringLiteral() { _stringBuilder.Clear(); while (true) { NextCharacter(); if (Eof()) - return CreateToken(TerminalKind.Invalid, "Unterminated string literal"); + return CreateToken(TokenKind.Invalid, "Unterminated string literal"); // Termination if (Character() == '"') { NextCharacter(); - return CreateToken(TerminalKind.StringLiteral, _stringBuilder.ToString()); + return CreateToken(TokenKind.StringLiteral, _stringBuilder.ToString()); } // backslash notation else if (Character() == '\\') { NextCharacter(); if (Eof()) - return CreateToken(TerminalKind.Invalid, "Unterminated string literal"); + return CreateToken(TokenKind.Invalid, "Unterminated string literal"); _stringBuilder.Append(Character()); } @@ -200,8 +200,8 @@ namespace Orchard.Widgets.SimpleScripting { return _expression[_index]; } - private Terminal CreateToken(TerminalKind kind, object value = null) { - return new Terminal { + private Token CreateToken(TokenKind kind, object value = null) { + return new Token { Kind = kind, Position = _startTokenIndex, Value = value diff --git a/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/ConstantAstNode.cs b/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/ConstantAstNode.cs deleted file mode 100644 index b074de4a3..000000000 --- a/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/ConstantAstNode.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace Orchard.Widgets.SimpleScripting { - public class ConstantAstNode : AstNode, IAstNodeWithToken { - private readonly Terminal _terminal; - - public ConstantAstNode(Terminal terminal) { - _terminal = terminal; - } - - public Terminal Terminal { - get { return _terminal; } - } - - public object Value { get { return _terminal.Value; } } - } -} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/IAstNodeWithToken.cs b/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/IAstNodeWithToken.cs deleted file mode 100644 index 55a91b5e9..000000000 --- a/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/IAstNodeWithToken.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace Orchard.Widgets.SimpleScripting { - public interface IAstNodeWithToken { - Terminal Terminal { get; } - } -} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/ScriptingManager.cs b/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/ScriptingManager.cs index 94406fa01..f48c4ad38 100644 --- a/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/ScriptingManager.cs +++ b/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/ScriptingManager.cs @@ -3,6 +3,8 @@ using System.Collections.Generic; using System.Linq; using Orchard.Caching; using Orchard.Widgets.Services; +using Orchard.Widgets.SimpleScripting.Ast; +using Orchard.Widgets.SimpleScripting.Compiler; namespace Orchard.Widgets.SimpleScripting { public interface IScriptingEngine : IDependency { diff --git a/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/UnaryAstNode.cs b/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/UnaryAstNode.cs deleted file mode 100644 index 7c0c87eb4..000000000 --- a/src/Orchard.Web/Modules/Orchard.Widgets/SimpleScripting/UnaryAstNode.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System.Collections.Generic; - -namespace Orchard.Widgets.SimpleScripting { - public class UnaryAstNode : AstNode, IAstNodeWithToken { - private readonly AstNode _expr; - private readonly Terminal _terminal; - - public UnaryAstNode(AstNode expr, Terminal terminal) { - _expr = expr; - _terminal = terminal; - } - - public Terminal Terminal { - get { return _terminal; } - } - - - public Terminal Operator { - get { return _terminal; } - } - - public override IEnumerable Children { - get { - yield return _expr; - } - } - } -} \ No newline at end of file