예제 #1
0
        private static Surf.Set Split(Surf.Set S, char character, Surf.Set transitions, Surf.Set P2)
        {
            //System.Console.WriteLine("START Split2     " + System.DateTime.Now.ToString());

            Surf.Set f_nP = PartitionMap(P2);

            Surf.Set partition_map = new Surf.Set();

            foreach (int fromState in S)
            {
                object key = new Surf.Tuple(new object[] { fromState, character });
                if (transitions.IsDefined(key))
                {
                    object value     = transitions.Apply(key);
                    int    toState   = (int)value;
                    int    partition = (int)f_nP.Apply(toState);
                    partition_map.Add(new Surf.Tuple(new object[] { partition, fromState }));
                }
                else
                {
                    partition_map.Add(new Surf.Tuple(new object[] { -1, fromState }));
                }
            }

            //System.Console.WriteLine("END   Split2     " + System.DateTime.Now.ToString());
            return(partition_map.Nest().Range());
        }
예제 #2
0
 private static Surf.Set SplitFinalStates(Token[] tokens)
 {
     Surf.Set fn = new Surf.Set();
     foreach (Token token in tokens)
     {
         fn.Add(new Surf.Tuple(new object[] { token.Name, token.Number }));
     }
     return(fn.Nest().Range());
 }
예제 #3
0
        public static void GenerateClass(string name, string multinamespace, Bamboo.Parsing.FiniteAutomata.FiniteAutomaton finiteAutomaton, System.IO.TextWriter writer)
        {
            writer.WriteLine("//");
            writer.WriteLine("// " + name + "Tokenizer.cpp");
            writer.WriteLine("//");
            writer.WriteLine("// AUTOGENERATED " + System.DateTime.Now + "");
            writer.WriteLine("//");
            writer.WriteLine("");
            writer.WriteLine("#include <istream>");
            writer.WriteLine("#include \"" + name + "Parser.h\"");
            writer.WriteLine("#include \"" + name + "Token.h\"");
            writer.WriteLine("#include \"" + name + "Tokenizer.h\"");
            writer.WriteLine("#include \"" + name + "TokenType.h\"");
            writer.WriteLine("");

            string[] namespaces = multinamespace.Split(new string[] { "::" }, StringSplitOptions.None);
            foreach (string nspace in namespaces)
            {
                writer.WriteLine("namespace " + nspace + "");
                writer.WriteLine("{");
            }

            writer.WriteLine("	int "+ name + "Tokenizer::_counter = 0;");
            writer.WriteLine("");
            writer.WriteLine("	void "+ name + "Tokenizer::next(char ch)");
            writer.WriteLine("	{");
            writer.WriteLine("		switch(_state)");
            writer.WriteLine("		{");

            //TODO if ch == -1, purge remaining token.

            foreach (int state in finiteAutomaton.States)
            {
                bool isFinal        = Operators.IsFinal(state, finiteAutomaton.FinalStates);
                bool hasTransitions = Operators.HasTransitions(state, finiteAutomaton.Transitions);

                if (!isFinal || hasTransitions)
                {
                    writer.WriteLine("		case "+ state + ":");
                    writer.WriteLine("			{");
                    writer.WriteLine("				switch (ch)");
                    writer.WriteLine("				{");
                    if (state == 0)
                    {
                        writer.WriteLine("				case ' ':");
                        writer.WriteLine("				case '\\t':");
                        writer.WriteLine("				case '\\r':");
                        writer.WriteLine("				case '\\n':");
                        writer.WriteLine("					{");
                        writer.WriteLine("						// Trim whitespace");
                        writer.WriteLine("						break;");
                        writer.WriteLine("					}");
                    }
                    Surf.Set transitions = new Surf.Set();
                    foreach (Bamboo.Parsing.FiniteAutomata.Transition transition in finiteAutomaton.Transitions)
                    {
                        if (transition.FromState == state)
                        {
                            transitions.Add(new Surf.Tuple(new object[] { transition.ToState, transition.Character }));
                        }
                    }
                    transitions = transitions.Nest();
                    foreach (Surf.Tuple transition in transitions)
                    {
                        foreach (char character in (Surf.Set)transition[1])
                        {
                            writer.WriteLine("				case '"+ Operators.Escape(character) + "':");
                        }
                        writer.WriteLine("					{");
                        bool isFinal2        = Operators.IsFinal((int)transition[0], finiteAutomaton.FinalStates);
                        bool hasTransitions2 = Operators.HasTransitions((int)transition[0], finiteAutomaton.Transitions);
                        writer.WriteLine("						_buffer += ch;");
                        if (isFinal2 && !hasTransitions2)
                        {
                            Bamboo.Parsing.FiniteAutomata.Token token = Operators.GetToken((int)transition[0], finiteAutomaton.Tokens);
                            writer.WriteLine("						"+ name + "Token token(" + name + "TokenType::" + token.Name + ", _buffer);");
                            writer.WriteLine("						_parser->next(token);");
                            writer.WriteLine("						_state = 0;");
                            writer.WriteLine("						_buffer.clear();");
                        }
                        else
                        {
                            writer.WriteLine("						_state = "+ transition[0] + ";");
                        }
                        writer.WriteLine("						break;");
                        writer.WriteLine("					}");
                    }
                    writer.WriteLine("				default:");
                    writer.WriteLine("					{");
                    if (isFinal)
                    {
                        Bamboo.Parsing.FiniteAutomata.Token token = Operators.GetToken(state, finiteAutomaton.Tokens);
                        writer.WriteLine("						"+ name + "Token token(" + name + "TokenType::" + token.Name + ", _buffer);");
                        writer.WriteLine("						_parser->next(token);");
                        writer.WriteLine("						_state = 0;");
                        writer.WriteLine("						_buffer.clear();");
                        writer.WriteLine("						next(ch);");
                    }
                    else
                    {
                        writer.WriteLine("						_buffer += ch;");
                        writer.WriteLine("						"+ name + "Token token(" + name + "TokenType::_ERROR_, _buffer);");
                        writer.WriteLine("						_parser->next(token);");
                    }
                    writer.WriteLine("						break;");
                    writer.WriteLine("					}");
                    writer.WriteLine("				}");
                    writer.WriteLine("				break;");
                    writer.WriteLine("			}");
                }
            }
            writer.WriteLine("		default:");
            writer.WriteLine("			{");
            writer.WriteLine("				"+ name + "Token token(" + name + "TokenType::_ERROR_, _buffer);");
            writer.WriteLine("				_parser->next(token);");
            writer.WriteLine("				break;");
            writer.WriteLine("			}");
            writer.WriteLine("		}");
            writer.WriteLine("	}");

            foreach (string nspace in namespaces)
            {
                writer.WriteLine("}");
            }
        }
예제 #4
0
        public static void Generate(string name, string nspace, Bamboo.Parsing.FiniteAutomata.FiniteAutomaton finiteAutomaton, System.IO.TextWriter writer)
        {
            writer.WriteLine("//");
            writer.WriteLine("// AUTOGENERATED " + System.DateTime.Now + "");
            writer.WriteLine("//");
            writer.WriteLine("using System;");
            writer.WriteLine("");
            writer.WriteLine("namespace " + nspace + "");
            writer.WriteLine("{");
            writer.WriteLine("	public class "+ name + "Tokenizer");
            writer.WriteLine("	{");
            writer.WriteLine("		private System.Text.StringBuilder _stringBuilder = new System.Text.StringBuilder();");
            writer.WriteLine("");
            writer.WriteLine("		public "+ name + "Tokenizer()");
            writer.WriteLine("		{");
            writer.WriteLine("		}");
            writer.WriteLine("");
            writer.WriteLine("		public "+ name + "Token Tokenize(" + name + "TextReader reader)");
            writer.WriteLine("		{");
            writer.WriteLine("			int n;");
            writer.WriteLine("			char ch;");
            writer.WriteLine("");
            writer.WriteLine("			_stringBuilder.Length = 0;");
            writer.WriteLine("");
            writer.WriteLine("			//");
            writer.WriteLine("			// Trim whitespace");
            writer.WriteLine("			//");
            writer.WriteLine("			while ((n = reader.Peek()) != -1)");
            writer.WriteLine("			{");
            writer.WriteLine("				ch = (char)n;");
            writer.WriteLine("				switch (ch)");
            writer.WriteLine("				{");
            writer.WriteLine("					case ' ':");
            writer.WriteLine("					case '\\t':");
            if (!HasNewline(finiteAutomaton.Tokens))
            {
                writer.WriteLine("					case '\\r':");
                writer.WriteLine("					case '\\n':");
            }
            writer.WriteLine("						{");
            writer.WriteLine("							reader.Read();");
            writer.WriteLine("							break;");
            writer.WriteLine("						}");
            writer.WriteLine("					default:");
            writer.WriteLine("						{");
            writer.WriteLine("							goto s0;");
            writer.WriteLine("						}");
            writer.WriteLine("				}");
            writer.WriteLine("			}");
            writer.WriteLine("");
            foreach (int state in finiteAutomaton.States)
            {
                writer.WriteLine("		s"+ state + ":");
                if (Operators.IsFinal(state, finiteAutomaton.FinalStates) && !Operators.HasTransitions(state, finiteAutomaton.Transitions))
                {
                    Bamboo.Parsing.FiniteAutomata.Token token = Operators.GetToken(state, finiteAutomaton.Tokens);
                    writer.WriteLine("			return new "+ name + "Token(" + name + "TokenType." + token.Name + ", _stringBuilder.ToString());");
                }
                else
                {
                    writer.WriteLine("			n = reader.Peek();");
                    writer.WriteLine("			if (n == -1)");
                    writer.WriteLine("			{");
                    writer.WriteLine("				if (_stringBuilder.Length == 0)");
                    writer.WriteLine("				{");
                    writer.WriteLine("					return new "+ name + "Token(" + name + "TokenType._EOF_);");
                    writer.WriteLine("				}");
                    writer.WriteLine("				else");
                    writer.WriteLine("				{");
                    if (Operators.IsFinal(state, finiteAutomaton.FinalStates))
                    {
                        Bamboo.Parsing.FiniteAutomata.Token token = Operators.GetToken(state, finiteAutomaton.Tokens);
                        writer.WriteLine("					return new "+ name + "Token(" + name + "TokenType." + token.Name + ", _stringBuilder.ToString());");
                    }
                    else
                    {
                        writer.WriteLine("					return new "+ name + "Token(" + name + "TokenType._ERROR_);");
                    }
                    writer.WriteLine("				}");
                    writer.WriteLine("			}");
                    writer.WriteLine("			ch = (char)n;");
                    writer.WriteLine("			switch (ch)");
                    writer.WriteLine("			{");

                    Surf.Set transitions = new Surf.Set();
                    foreach (Bamboo.Parsing.FiniteAutomata.Transition transition in finiteAutomaton.Transitions)
                    {
                        if (transition.FromState == state)
                        {
                            transitions.Add(new Surf.Tuple(new object[] { transition.ToState, transition.Character }));
                        }
                    }
                    transitions = transitions.Nest();
                    foreach (Surf.Tuple transition in transitions)
                    {
                        foreach (char character in (Surf.Set)transition[1])
                        {
                            writer.WriteLine("				case '"+ Operators.Escape(character) + "':");
                        }
                        writer.WriteLine("					{");
                        writer.WriteLine("						reader.Read();");
                        writer.WriteLine("						_stringBuilder.Append(ch);");
                        writer.WriteLine("						goto s"+ transition[0] + ";");
                        writer.WriteLine("					}");
                    }

                    writer.WriteLine("				default:");
                    writer.WriteLine("					{");
                    if (Operators.IsFinal(state, finiteAutomaton.FinalStates))
                    {
                        Bamboo.Parsing.FiniteAutomata.Token token = Operators.GetToken(state, finiteAutomaton.Tokens);
                        writer.WriteLine("						return new "+ name + "Token(" + name + "TokenType." + token.Name + ", _stringBuilder.ToString());");
                    }
                    else
                    {
                        writer.WriteLine("						_stringBuilder.Append(ch);");
                        writer.WriteLine("						goto se;");
                    }
                    writer.WriteLine("					}");
                    writer.WriteLine("			}");
                }
                writer.WriteLine("");
            }
            writer.WriteLine("		se:");
            writer.WriteLine("			return new "+ name + "Token(" + name + "TokenType._ERROR_, _stringBuilder.ToString());");
            writer.WriteLine("");
            writer.WriteLine("		}");
            writer.WriteLine("");
            writer.WriteLine("	}");
            writer.WriteLine("}");
        }