Click here to Skip to main content
15,897,704 members
Articles / Programming Languages / C#

An Expression Parser for CodeDom

Rate me:
Please Sign up or sign in to vote.
4.78/5 (51 votes)
22 Apr 2009CPOL4 min read 141.1K   1.1K   74  
Tired of writing long, complicated CodeDom expressions? This parser's for you!
using System;
using CodeDomExpParser;
using Microsoft.VisualStudio.TestTools.UnitTesting;
 
namespace CodeDomExpParser.Test
{
    [TestClass]
	public class TestTokenizer
	{
		[TestMethod]
        public void Tokenizer01_Class() 
		{
			Tokenizer t = new Tokenizer("AClass");
			Token token = t.GetNextToken();
			Assert.AreEqual("AClass", token.Text);
			Assert.AreEqual(TokenType.Identifier, token.Type);
			Assert.AreEqual(TokenPriority.None, token.Priority);
		}

		[TestMethod]
        public void Tokenizer02_Property()
		{
			Tokenizer t = new Tokenizer("AClass.AProperty");
			Token token = t.GetNextToken();
			Assert.AreEqual("AClass", token.Text);
			Assert.AreEqual(TokenType.Identifier, token.Type);
			Assert.AreEqual(TokenPriority.None, token.Priority);
			token = t.GetNextToken();
			Assert.AreEqual(".", token.Text);
			Assert.AreEqual(TokenType.Dot, token.Type);
			Assert.AreEqual(TokenPriority.None, token.Priority);
			token = t.GetNextToken();
			Assert.AreEqual("AProperty", token.Text);
			Assert.AreEqual(TokenType.Identifier, token.Type);
			Assert.AreEqual(TokenPriority.None, token.Priority);
		}

		[TestMethod]
		public void Tokenizer03_Primitive_String()
		{
			Tokenizer t = new Tokenizer("\"AString\"");
			Token token = t.GetNextToken();
			Assert.AreEqual("AString", token.ParsedObject);
			Assert.AreEqual(TokenType.Primitive, token.Type);
			Assert.AreEqual(TokenPriority.None, token.Priority);

			t = new Tokenizer("\"This string contains \\\"quoted text.\\\"\"");
			token = t.GetNextToken();
			Assert.AreEqual(@"This string contains \""quoted text.\""", token.ParsedObject);
			Assert.AreEqual(TokenType.Primitive, token.Type);
			Assert.AreEqual(TokenPriority.None, token.Priority);
		}

		[TestMethod]
		public void Tokenizer04_Primitive_Integer()
		{
			Tokenizer t = new Tokenizer("65");
			Token token = t.GetNextToken();
			Assert.AreEqual(typeof(Int32), token.ParsedObject.GetType());
			Assert.AreEqual(65, token.ParsedObject);
			Assert.AreEqual(TokenType.Primitive, token.Type);
			Assert.AreEqual(TokenPriority.None, token.Priority);
		}

		[TestMethod]
		public void Tokenizer05_Primitive_Long()
		{
			Tokenizer t = new Tokenizer("2943L");
			Token token = t.GetNextToken();
			Assert.AreEqual(typeof(Int64), token.ParsedObject.GetType());
			Assert.AreEqual(2943L, token.ParsedObject);
			Assert.AreEqual(TokenType.Primitive, token.Type);
			Assert.AreEqual(TokenPriority.None, token.Priority);
		}

		[TestMethod]
		public void Tokenizer06_Primitive_Double()
		{
			Tokenizer t = new Tokenizer("32.76");
			Token token = t.GetNextToken();
			Assert.AreEqual(typeof(Double), token.ParsedObject.GetType());
			Assert.AreEqual(32.76D, token.ParsedObject);
			Assert.AreEqual(TokenType.Primitive, token.Type);
			Assert.AreEqual(TokenPriority.None, token.Priority);

			t = new Tokenizer("32.76D");
			token = t.GetNextToken();
			Assert.AreEqual(typeof(Double), token.ParsedObject.GetType());
			Assert.AreEqual(32.76D, token.ParsedObject);
			Assert.AreEqual(TokenType.Primitive, token.Type);
			Assert.AreEqual(TokenPriority.None, token.Priority);

			t = new Tokenizer("32D");
			token = t.GetNextToken();
			Assert.AreEqual(typeof(Double), token.ParsedObject.GetType());
			Assert.AreEqual(32D, token.ParsedObject);
			Assert.AreEqual(TokenType.Primitive, token.Type);
			Assert.AreEqual(TokenPriority.None, token.Priority);
		}

		[TestMethod]
		public void Tokenizer07_Primitive_Boolean()
		{
			Tokenizer t = new Tokenizer("true");
			Token token = t.GetNextToken();
			Assert.AreEqual(typeof(Boolean), token.ParsedObject.GetType());
			Assert.AreEqual(true, token.ParsedObject);
			Assert.AreEqual(TokenType.Primitive, token.Type);
			Assert.AreEqual(TokenPriority.None, token.Priority);

			t = new Tokenizer("false");
			token = t.GetNextToken();
			Assert.AreEqual(typeof(Boolean), token.ParsedObject.GetType());
			Assert.AreEqual(false, token.ParsedObject);
			Assert.AreEqual(TokenType.Primitive, token.Type);
			Assert.AreEqual(TokenPriority.None, token.Priority);
		}

		[TestMethod]
		public void Tokenizer08_GreaterThan() 
		{
			Tokenizer t;
			Token token;

			t = new Tokenizer("MyClass.PropertyA > 3");
			token = t.GetNextToken();
			Assert.AreEqual("MyClass", token.Text);
			Assert.AreEqual(TokenType.Identifier, token.Type);
			token = t.GetNextToken();
			Assert.AreEqual(TokenType.Dot, token.Type);
			token = t.GetNextToken();
			Assert.AreEqual("PropertyA", token.Text);
			Assert.AreEqual(TokenType.Identifier, token.Type);
			token = t.GetNextToken();
			Assert.AreEqual(">", token.Text);
			Assert.AreEqual(TokenType.Operator, token.Type);
			Assert.AreEqual(TokenPriority.Equality, token.Priority);
			token = t.GetNextToken();
			Assert.AreEqual(3, token.ParsedObject);
		}

		[TestMethod]
		public void Tokenizer09_LessThan() 
		{
			Tokenizer t;
			Token token;

			t = new Tokenizer("MyClass.PropertyA  <MyClass.PropertyB");
			token = t.GetNextToken();
			Assert.AreEqual("MyClass", token.Text);
			Assert.AreEqual(TokenType.Identifier, token.Type);
			token = t.GetNextToken();
			Assert.AreEqual(TokenType.Dot, token.Type);
			token = t.GetNextToken();
			Assert.AreEqual("PropertyA", token.Text);
			Assert.AreEqual(TokenType.Identifier, token.Type);
			token = t.GetNextToken();
			Assert.AreEqual("<", token.Text);
			Assert.AreEqual(TokenType.Operator, token.Type);
			Assert.AreEqual(TokenPriority.Equality, token.Priority);
			token = t.GetNextToken();
			Assert.AreEqual("MyClass", token.Text);
			Assert.AreEqual(TokenType.Identifier, token.Type);
			token = t.GetNextToken();
			Assert.AreEqual(TokenType.Dot, token.Type);
			token = t.GetNextToken();
			Assert.AreEqual("PropertyB", token.Text);
			Assert.AreEqual(TokenType.Identifier, token.Type);
		}

		[TestMethod]
		public void Tokenizer10_GreaterThanOrEqual() 
		{
			Tokenizer t;
			Token token;

			t = new Tokenizer("MyClass.PropertyA>=87L");
			token = t.GetNextToken();
			Assert.AreEqual("MyClass", token.Text);
			Assert.AreEqual(TokenType.Identifier, token.Type);
			token = t.GetNextToken();
			Assert.AreEqual(TokenType.Dot, token.Type);
			token = t.GetNextToken();
			Assert.AreEqual("PropertyA", token.Text);
			Assert.AreEqual(TokenType.Identifier, token.Type);
			token = t.GetNextToken();
			Assert.AreEqual(">=", token.Text);
			Assert.AreEqual(TokenType.Operator, token.Type);
			Assert.AreEqual(TokenPriority.Equality, token.Priority);
			token = t.GetNextToken();
			Assert.AreEqual(typeof(long), token.ParsedObject.GetType());
			Assert.AreEqual(87L, token.ParsedObject);
		}

		[TestMethod]
		public void Tokenizer11_LessThanOrEqual() 
		{
			Tokenizer t;
			Token token;

			t = new Tokenizer("MyClass.PropertyA	<=	821.12");
			token = t.GetNextToken();
			Assert.AreEqual("MyClass", token.Text);
			Assert.AreEqual(TokenType.Identifier, token.Type);
			token = t.GetNextToken();
			Assert.AreEqual(TokenType.Dot, token.Type);
			token = t.GetNextToken();
			Assert.AreEqual("PropertyA", token.Text);
			Assert.AreEqual(TokenType.Identifier, token.Type);
			token = t.GetNextToken();
			Assert.AreEqual("<=", token.Text);
			Assert.AreEqual(TokenType.Operator, token.Type);
			Assert.AreEqual(TokenPriority.Equality, token.Priority);
			token = t.GetNextToken();
			Assert.AreEqual(typeof(double), token.ParsedObject.GetType());
			Assert.AreEqual(821.12D, token.ParsedObject);
		}

		[TestMethod]
		public void Tokenizer12_Equals() 
		{
			Tokenizer t;
			Token token;

			t = new Tokenizer("MyClass.PropertyA == 3D");
			token = t.GetNextToken();
			Assert.AreEqual("MyClass", token.Text);
			Assert.AreEqual(TokenType.Identifier, token.Type);
			token = t.GetNextToken();
			Assert.AreEqual(TokenType.Dot, token.Type);
			token = t.GetNextToken();
			Assert.AreEqual("PropertyA", token.Text);
			Assert.AreEqual(TokenType.Identifier, token.Type);
			token = t.GetNextToken();
			Assert.AreEqual("==", token.Text);
			Assert.AreEqual(TokenType.Operator, token.Type);
			Assert.AreEqual(TokenPriority.Equality, token.Priority);
			token = t.GetNextToken();
			Assert.AreEqual(typeof(double), token.ParsedObject.GetType());
			Assert.AreEqual(3D, token.ParsedObject);
		}

		[TestMethod]
		public void Tokenizer13_Plus() 
		{
			Tokenizer t;
			Token token;

			t = new Tokenizer("1+2");
			token = t.GetNextToken();
			Assert.AreEqual(typeof(int), token.ParsedObject.GetType());
			Assert.AreEqual(1, token.ParsedObject);
			token = t.GetNextToken();
			Assert.AreEqual("+", token.Text);
			Assert.AreEqual(TokenType.Operator, token.Type);
			Assert.AreEqual(TokenPriority.PlusMinus, token.Priority);
			token = t.GetNextToken();
			Assert.AreEqual(typeof(int), token.ParsedObject.GetType());
			Assert.AreEqual(2, token.ParsedObject);
		}

		[TestMethod]
		public void Tokenizer14_Minus() 
		{
			Tokenizer t;
			Token token;

			t = new Tokenizer("3-2");
			token = t.GetNextToken();
			Assert.AreEqual(typeof(int), token.ParsedObject.GetType());
			Assert.AreEqual(3, token.ParsedObject);
			token = t.GetNextToken();
			Assert.AreEqual("-", token.Text);
			Assert.AreEqual(TokenType.Operator, token.Type);
			Assert.AreEqual(TokenPriority.PlusMinus, token.Priority);
			token = t.GetNextToken();
			Assert.AreEqual(typeof(int), token.ParsedObject.GetType());
			Assert.AreEqual(2, token.ParsedObject);
		}

		[TestMethod]
		public void Tokenizer15_UnaryMinus() 
		{
			Tokenizer t;
			Token token;

			t = new Tokenizer("3+-2");
			token = t.GetNextToken();
			Assert.AreEqual(typeof(int), token.ParsedObject.GetType());
			Assert.AreEqual(3, token.ParsedObject);
			token = t.GetNextToken();
			Assert.AreEqual("+", token.Text);
			Assert.AreEqual(TokenType.Operator, token.Type);
			Assert.AreEqual(TokenPriority.PlusMinus, token.Priority);
			token = t.GetNextToken();
			Assert.AreEqual("-", token.Text);
			Assert.AreEqual(TokenType.Operator, token.Type);
			Assert.AreEqual(TokenPriority.UnaryMinus, token.Priority);
			token = t.GetNextToken();
			Assert.AreEqual(typeof(int), token.ParsedObject.GetType());
			Assert.AreEqual(2, token.ParsedObject);

			t = new Tokenizer("3--2");
			token = t.GetNextToken();
			Assert.AreEqual(typeof(int), token.ParsedObject.GetType());
			Assert.AreEqual(3, token.ParsedObject);
			token = t.GetNextToken();
			Assert.AreEqual("-", token.Text);
			Assert.AreEqual(TokenType.Operator, token.Type);
			Assert.AreEqual(TokenPriority.PlusMinus, token.Priority);
			token = t.GetNextToken();
			Assert.AreEqual("-", token.Text);
			Assert.AreEqual(TokenType.Operator, token.Type);
			Assert.AreEqual(TokenPriority.UnaryMinus, token.Priority);
			token = t.GetNextToken();
			Assert.AreEqual(typeof(int), token.ParsedObject.GetType());
			Assert.AreEqual(2, token.ParsedObject);
		}

		[TestMethod]
		public void Tokenizer16_Multiply() 
		{
			Tokenizer t;
			Token token;

			t = new Tokenizer("6*9");
			token = t.GetNextToken();
			Assert.AreEqual(typeof(int), token.ParsedObject.GetType());
			Assert.AreEqual(6, token.ParsedObject);
			token = t.GetNextToken();
			Assert.AreEqual("*", token.Text);
			Assert.AreEqual(TokenType.Operator, token.Type);
			Assert.AreEqual(TokenPriority.MulDiv, token.Priority);
			token = t.GetNextToken();
			Assert.AreEqual(typeof(int), token.ParsedObject.GetType());
			Assert.AreEqual(9, token.ParsedObject);
		}

		[TestMethod]
		public void Tokenizer17_Divide() 
		{
			Tokenizer t;
			Token token;

			t = new Tokenizer("15/3");
			token = t.GetNextToken();
			Assert.AreEqual(typeof(int), token.ParsedObject.GetType());
			Assert.AreEqual(15, token.ParsedObject);
			token = t.GetNextToken();
			Assert.AreEqual("/", token.Text);
			Assert.AreEqual(TokenType.Operator, token.Type);
			Assert.AreEqual(TokenPriority.MulDiv, token.Priority);
			token = t.GetNextToken();
			Assert.AreEqual(typeof(int), token.ParsedObject.GetType());
			Assert.AreEqual(3, token.ParsedObject);
		}

		[TestMethod]
		public void Tokenizer18_Not() 
		{
			Tokenizer t;
			Token token;

			t = new Tokenizer("!MyClass.PropertyA");
			token = t.GetNextToken();
			Assert.AreEqual("!", token.Text);
			Assert.AreEqual(TokenType.Operator, token.Type);
			Assert.AreEqual(TokenPriority.Not, token.Priority);
			token = t.GetNextToken();
			Assert.AreEqual("MyClass", token.Text);
			Assert.AreEqual(TokenType.Identifier, token.Type);
			token = t.GetNextToken();
			Assert.AreEqual(TokenType.Dot, token.Type);
			token = t.GetNextToken();
			Assert.AreEqual("PropertyA", token.Text);
			Assert.AreEqual(TokenType.Identifier, token.Type);
		}

		[TestMethod]
		public void Tokenizer19_NotEqual() 
		{
			Tokenizer t;
			Token token;

			t = new Tokenizer("MyClass.Foo != \"Bar\"");
			token = t.GetNextToken();
			Assert.AreEqual("MyClass", token.Text);
			Assert.AreEqual(TokenType.Identifier, token.Type);
			token = t.GetNextToken();
			Assert.AreEqual(TokenType.Dot, token.Type);
			token = t.GetNextToken();
			Assert.AreEqual("Foo", token.Text);
			Assert.AreEqual(TokenType.Identifier, token.Type);
			token = t.GetNextToken();
			Assert.AreEqual("!=", token.Text);
			Assert.AreEqual(TokenType.Operator, token.Type);
			Assert.AreEqual(TokenPriority.Equality, token.Priority);
			token = t.GetNextToken();
			Assert.AreEqual("Bar", token.ParsedObject);
		}
	}
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer Microsoft
United States United States
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions