示例#1
0
        public static void GenerateClass(string name, string multinamespace, Bamboo.Parsing.FiniteAutomata.FiniteAutomaton finiteAutomaton, System.IO.TextWriter writer)
        {
            writer.WriteLine("//");
            writer.WriteLine("// " + name + "Token.cpp");
            writer.WriteLine("//");
            writer.WriteLine("// AUTOGENERATED " + System.DateTime.Now + "");
            writer.WriteLine("//");
            writer.WriteLine("");
            writer.WriteLine("#include \"" + name + "Token.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 + "Token::_counter = 0;");
            writer.WriteLine("");

            foreach (string nspace in namespaces)
            {
                writer.WriteLine("}");
            }
        }
示例#2
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 + "Token");
     writer.WriteLine("	{");
     writer.WriteLine("		public int Type;");
     writer.WriteLine("		public string Value;");
     writer.WriteLine("");
     writer.WriteLine("		public "+ name + "Token(int type)");
     writer.WriteLine("		{");
     writer.WriteLine("			Type = type;");
     writer.WriteLine("			Value = null;");
     writer.WriteLine("		}");
     writer.WriteLine("");
     writer.WriteLine("		public "+ name + "Token(int type, string value)");
     writer.WriteLine("		{");
     writer.WriteLine("			Type = type;");
     writer.WriteLine("			Value = value;");
     writer.WriteLine("		}");
     writer.WriteLine("");
     writer.WriteLine("	}");
     writer.WriteLine("}");
 }
示例#3
0
        public static void GenerateHeader(string name, string multinamespace, Bamboo.Parsing.FiniteAutomata.FiniteAutomaton finiteAutomaton, System.IO.TextWriter writer)
        {
            writer.WriteLine("//");
            writer.WriteLine("// " + name + "Token.h");
            writer.WriteLine("//");
            writer.WriteLine("// AUTOGENERATED " + System.DateTime.Now + "");
            writer.WriteLine("//");
            writer.WriteLine("");
            writer.WriteLine("#ifndef " + name.ToUpper() + "TOKEN_H");
            writer.WriteLine("#define " + name.ToUpper() + "TOKEN_H");
            writer.WriteLine("");
            writer.WriteLine("#include <iostream>");
            writer.WriteLine("#include <string>");
            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("	class "+ name + "Token");
            writer.WriteLine("	{");
            writer.WriteLine("	private:");
            writer.WriteLine("		static int _counter;");
            writer.WriteLine("");
            writer.WriteLine("		int _type;");
            writer.WriteLine("		std::string _value;");
            writer.WriteLine("	public:");
            writer.WriteLine("		"+ name + "Token(int type) : _type(type) { _counter++; }");
            writer.WriteLine("		"+ name + "Token(int type, std::string value) : _type(type), _value(value) { _counter++; }");
            writer.WriteLine("		~"+ name + "Token() { _counter--; }");
            writer.WriteLine("		static int counter() { return _counter; }");
            writer.WriteLine("");
            writer.WriteLine("		int type() { return _type; }");
            writer.WriteLine("		std::string value() { return _value; }");
            writer.WriteLine("");
            writer.WriteLine("		friend std::ostream& operator<<(std::ostream& stream, Token& token) { ");
            writer.WriteLine("			stream << \"TOKEN \" << token._type;");
            writer.WriteLine("			if(!token._value.empty())");
            writer.WriteLine("				stream << \" \" << token._value;");
            writer.WriteLine("			return stream << std::endl; }");
            writer.WriteLine("		friend std::ostream& operator<<(std::ostream& stream, Token* token) { ");
            writer.WriteLine("			stream << \"TOKEN \" << token->_type;");
            writer.WriteLine("			if(!token->_value.empty())");
            writer.WriteLine("				stream << \" \" << token->_value;");
            writer.WriteLine("			return stream << std::endl; }");
            writer.WriteLine("	};");

            foreach (string nspace in namespaces)
            {
                writer.WriteLine("}");
            }
            writer.WriteLine("#endif");
        }
示例#4
0
        public static void GenerateHeader(string name, string multinamespace, Bamboo.Parsing.FiniteAutomata.FiniteAutomaton finiteAutomaton, System.IO.TextWriter writer)
        {
            writer.WriteLine("//");
            writer.WriteLine("// " + name + "Tokenizer.h");
            writer.WriteLine("//");
            writer.WriteLine("// AUTOGENERATED " + System.DateTime.Now + "");
            writer.WriteLine("//");
            writer.WriteLine("");
            writer.WriteLine("#ifndef " + name.ToUpper() + "TOKENIZER_H");
            writer.WriteLine("#define " + name.ToUpper() + "TOKENIZER_H");
            writer.WriteLine("");
            writer.WriteLine("#include <string>");
            writer.WriteLine("#include \"" + name + "Parser.h\"");
            writer.WriteLine("#include \"" + name + "Token.h\"");
            writer.WriteLine("");

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

            writer.WriteLine("	class "+ name + "Tokenizer");
            writer.WriteLine("	{");
            writer.WriteLine("	private:");
            writer.WriteLine("		"+ name + "Tokenizer(const " + name + "Tokenizer&);");
            writer.WriteLine("		"+ name + "Tokenizer operator=(const " + name + "Tokenizer&);");
            writer.WriteLine("		static int _counter;");
            writer.WriteLine("");
            writer.WriteLine("		"+ name + "Parser* _parser;");
            writer.WriteLine("		int _state;");
            writer.WriteLine("		std::string _buffer;");
            writer.WriteLine("	public:");
            writer.WriteLine("		"+ name + "Tokenizer(" + name + "Parser* parser) : _parser(parser), _state(0) { _counter++; }");
            writer.WriteLine("		~"+ name + "Tokenizer() { _counter--; }");
            writer.WriteLine("		static int counter() { return _counter; }");
            writer.WriteLine("");
            writer.WriteLine("		void next(char ch);");
            writer.WriteLine("	};");

            foreach (string nspace in namespaces)
            {
                writer.WriteLine("}");
            }
            writer.WriteLine("#endif");
        }
示例#5
0
        public static void GenerateHeader(string name, string multinamespace, Bamboo.Parsing.FiniteAutomata.FiniteAutomaton finiteAutomaton, System.IO.TextWriter writer)
        {
            writer.WriteLine("//");
            writer.WriteLine("// " + name + "TokenType.h");
            writer.WriteLine("//");
            writer.WriteLine("// AUTOGENERATED " + System.DateTime.Now + "");
            writer.WriteLine("//");
            writer.WriteLine("");
            writer.WriteLine("#pragma once");
            writer.WriteLine("");

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

            writer.WriteLine("namespace " + name + "TokenType");
            writer.WriteLine("{");
            Dictionary <string, string> tokens = new Dictionary <string, string>();

            foreach (Bamboo.Parsing.FiniteAutomata.Token token in finiteAutomaton.Tokens)
            {
                if (!tokens.ContainsKey(token.Name))
                {
                    tokens.Add(token.Name, token.Name);
                }
            }
            int i = 0;

            foreach (string tokenName in tokens.Keys)
            {
                writer.WriteLine("	const int "+ tokenName + " = " + i++ + ";");
            }

            writer.WriteLine("");
            writer.WriteLine("	const int _ERROR_ = "+ i++ + ";");
            writer.WriteLine("	const int _EOF_ = "+ i++ + ";");
            writer.WriteLine("}");

            foreach (string nspace in namespaces)
            {
                writer.WriteLine("}");
            }
        }
示例#6
0
        private static FiniteAutomaton Reorder(Bamboo.Parsing.FiniteAutomata.FiniteAutomaton fa)
        {
            System.Console.WriteLine("START Reorder     " + System.DateTime.Now.ToString());

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

            GetToStates(fa.StartState, fa.Transitions, stateMap, new Counter());



            Surf.Set states      = new Surf.Set();
            Surf.Set alphabet    = new Surf.Set();
            Surf.Set transitions = new Surf.Set();
            int      startState;

            Surf.Set finalStates = new Surf.Set();
            Surf.Set tokens      = new Surf.Set();

            for (int i = 0; i < fa.States.Length; i++)
            {
                states.Add(stateMap.Apply(fa.States[i]));
            }
            alphabet = new Surf.Set(fa.Alphabet);
            for (int i = 0; i < fa.Transitions.Length; i++)
            {
                if (fa.Transitions[i].Epsilon)
                {
                    transitions.Add(new Surf.Tuple(new object[] { new Surf.Tuple(new object[] { stateMap.Apply(fa.Transitions[i].FromState) }), stateMap.Apply(fa.Transitions[i].ToState) }));
                }
                else
                {
                    transitions.Add(new Surf.Tuple(new object[] { new Surf.Tuple(new object[] { stateMap.Apply(fa.Transitions[i].FromState), fa.Transitions[i].Character }), stateMap.Apply(fa.Transitions[i].ToState) }));
                }
            }
            startState = (int)stateMap.Apply(fa.StartState);
            for (int i = 0; i < fa.FinalStates.Length; i++)
            {
                finalStates.Add(stateMap.Apply(fa.FinalStates[i]));
                tokens.Add(new Surf.Tuple(new object[] { stateMap.Apply(fa.FinalStates[i]), Lookup(fa.Tokens, fa.FinalStates[i]) }));
            }

            System.Console.WriteLine("END   Reorder     " + System.DateTime.Now.ToString());
            return(new FiniteAutomaton(states, alphabet, transitions, startState, finalStates, tokens));
        }
示例#7
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 + "TextReader");
     writer.WriteLine("	{");
     writer.WriteLine("		private System.IO.TextReader _reader;");
     writer.WriteLine("");
     writer.WriteLine("		public int Line = 1;");
     writer.WriteLine("		public int Column = 1;");
     writer.WriteLine("");
     writer.WriteLine("		public "+ name + "TextReader(System.IO.TextReader reader)");
     writer.WriteLine("		{");
     writer.WriteLine("			this._reader = reader;");
     writer.WriteLine("		}");
     writer.WriteLine("");
     writer.WriteLine("		public int Peek()");
     writer.WriteLine("		{");
     writer.WriteLine("			return this._reader.Peek();");
     writer.WriteLine("		}");
     writer.WriteLine("");
     writer.WriteLine("		public int Read()");
     writer.WriteLine("		{");
     writer.WriteLine("			char ch = (char)this._reader.Read();");
     writer.WriteLine("			if(ch == '\\n')");
     writer.WriteLine("			{");
     writer.WriteLine("				Line++;");
     writer.WriteLine("				Column = 1;");
     writer.WriteLine("			}");
     writer.WriteLine("			return ch;");
     writer.WriteLine("		}");
     writer.WriteLine("");
     writer.WriteLine("	}");
     writer.WriteLine("}");
 }
示例#8
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 + "TokenType");
            writer.WriteLine("	{");

            Dictionary <string, string> tokens = new Dictionary <string, string>();

            foreach (Bamboo.Parsing.FiniteAutomata.Token token in finiteAutomaton.Tokens)
            {
                if (!tokens.ContainsKey(token.Name))
                {
                    tokens.Add(token.Name, token.Name);
                }
            }

            int i = 0;

            foreach (string tokenName in tokens.Keys)
            {
                writer.WriteLine("		public const int "+ tokenName + " = " + i + ";");
                i++;
            }

            writer.WriteLine("");
            writer.WriteLine("		public const int _ERROR_ = "+ i + ";");
            i++;
            writer.WriteLine("		public const int _EOF_ = "+ i + ";");
            writer.WriteLine("	}");
            writer.WriteLine("}");
        }
示例#9
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("}");
            }
        }
示例#10
0
        public static FiniteAutomaton DFA(Bamboo.Parsing.FiniteAutomata.FiniteAutomaton nfa, Counter counter)
        {
            System.Console.WriteLine("START DFA     " + System.DateTime.Now.ToString());

            Surf.Set epsilonCache = new Surf.Set();
            Surf.Set moveCache    = new Surf.Set();

            Surf.Set nfa_transitions = Set(nfa.Transitions);

            Dictionary <string, int> nfa_transitions_lookup = new Dictionary <string, int>();

            foreach (Surf.Tuple transition in nfa_transitions)
            {
                Surf.Tuple input = (Surf.Tuple)transition[0];

                if (input.Count == 2)
                {
                    int  state = (int)input[0];
                    char ch    = (char)input[1];

                    nfa_transitions_lookup.Add("" + state + "::" + ch, (int)transition[1]);
                }
            }

            Surf.Set q0 = EpsilonClosure(new Surf.Set(new object[] { nfa.StartState }), nfa_transitions, epsilonCache);
            Surf.Set Q  = new Surf.Set();            // A set whose element are sets of states that are subsets of N.
            Q.Add(q0);
            Surf.Set         T        = new Surf.Set();
            Stack <Surf.Set> worklist = new Stack <Surf.Set>();

            worklist.Push(q0);

            while (worklist.Count > 0)
            {
                Surf.Set q = worklist.Pop();

                foreach (char character in nfa.Alphabet)
                {
                    Surf.Set t = EpsilonClosure(Move(q, character, nfa_transitions_lookup), nfa_transitions, epsilonCache);

                    if (t.Count > 0)
                    {
                        T.Add(new Surf.Tuple(new object[] { new Surf.Tuple(new object[] { q, character }), t }));

                        if (!Q.Contains(t))
                        {
                            Q.Add(t);
                            worklist.Push(t);
                        }
                    }
                }
            }



            Surf.Set states      = new Surf.Set();
            Surf.Set alphabet    = new Surf.Set();
            Surf.Set transitions = new Surf.Set();
            int      startState;

            Surf.Set finalStates = new Surf.Set();
            Surf.Set tokens      = new Surf.Set();

            Surf.Set D = new Surf.Set();
            foreach (Surf.Set q in Q)
            {
                D.Add(new Surf.Tuple(new object[] { q, counter.Next() }));
            }



            foreach (Surf.Set q in Q)
            {
                states.Add(D.Apply(q));
            }
            alphabet = new Surf.Set(nfa.Alphabet);
            foreach (Surf.Tuple t in T)
            {
                Surf.Tuple input     = (Surf.Tuple)t[0];
                int        fromState = (int)D.Apply(input[0]);
                char       character = (char)input[1];
                int        toState   = (int)D.Apply(t[1]);
                transitions.Add(new Surf.Tuple(new object[] { new Surf.Tuple(new object[] { fromState, character }), toState }));
            }
            startState = (int)states[0];
            foreach (int state in nfa.FinalStates)
            {
                foreach (Surf.Tuple d in D)
                {
                    Surf.Set q = (Surf.Set)d[0];
                    if (q.Contains(state))
                    {
                        finalStates.Add(d[1]);
                        foreach (int q_state in q)
                        {
                            string token = Lookup(nfa.Tokens, (int)q_state);
                            if (token.Length > 0)
                            {
                                tokens.Add(new Surf.Tuple(new object[] { d[1], token }));
                                break;
                            }
                        }
                    }
                }
            }

            System.Console.WriteLine("END   DFA     " + System.DateTime.Now.ToString());
            //foreach (Token token in nfa.Tokens)
            //{
            //    System.Console.WriteLine(token.Name + " " + token.Number);
            //}
            //System.Console.WriteLine();
            //Surf.Printer.Print(tokens, System.Console.Out);
            //System.Console.WriteLine();
            //System.Console.WriteLine();
            return(Minimize(Reorder(new FiniteAutomaton(states, alphabet, transitions, startState, finalStates, tokens))));
        }
示例#11
0
        //
        // Subset Construction
        //

        public static FiniteAutomaton DFA(Bamboo.Parsing.FiniteAutomata.FiniteAutomaton nfa)
        {
            return(DFA(nfa, new Counter()));
        }
示例#12
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("}");
        }
示例#13
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 static readonly int[,] TABLE = new int[,] {");

            Surf.Set transitions = new Surf.Set();
            foreach (Bamboo.Parsing.FiniteAutomata.Transition transition in finiteAutomaton.Transitions)
            {
                transitions.Add(new Surf.Tuple(new object[] { new Surf.Tuple(new object[] { transition.FromState, transition.Character }), transition.ToState }));
            }
            foreach (int state in finiteAutomaton.States)
            {
                writer.Write("			{	");
                foreach (object character in finiteAutomaton.Alphabet)
                {
                    Surf.Tuple key = new Surf.Tuple(new object[] { state, character });
                    if (transitions.IsDefined(key))
                    {
                        int toState = (int)transitions.Apply(key);
                        writer.Write("" + toState + ",		");
                    }
                    else
                    {
                        writer.Write("-1,		");
                    }
                }
                writer.WriteLine("},");
            }

            writer.WriteLine("		};");
            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("");

            /*
             * //
             * // Trim whitespace
             * //
             * while ((n = reader.Peek()) != -1)
             * {
             *      ch = (char)n;
             *      switch (ch)
             *      {
             *              case ' ':
             *              case '\t':
             *              case '\r':
             *              case '\n':
             *                      {
             *                              break;
             *                      }
             *              default:
             *                      {
             *                              goto s0;
             *                      }
             *      }
             * }
             */
            writer.WriteLine("			n = reader.Peek();");
            writer.WriteLine("			ch = (char)0;");
            writer.WriteLine("			int state = 0;");
            writer.WriteLine("");
            writer.WriteLine("			if (n == -1)");
            writer.WriteLine("			{");
            writer.WriteLine("				return new "+ name + "Token(" + name + "TokenType._EOF_);");
            writer.WriteLine("			}");
            writer.WriteLine("");
            writer.WriteLine("			while(n != -1 && state != -1)");
            writer.WriteLine("			{");
            writer.WriteLine("				ch = (char)n;");
            writer.WriteLine("");
            writer.WriteLine("				switch(ch)");
            writer.WriteLine("				{");

            int i = 0;

            foreach (char character in finiteAutomaton.Alphabet)
            {
                writer.WriteLine("					case '"+ Escape(character) + "':");
                writer.WriteLine("					{");
                writer.WriteLine("						int state2 = TABLE[state, "+ i + "];");
                writer.WriteLine("						if(state2 == -1)");
                writer.WriteLine("						{");
                writer.WriteLine("							goto EXIT;");
                writer.WriteLine("						}");
                writer.WriteLine("");
                writer.WriteLine("						state = state2;");
                writer.WriteLine("						_stringBuilder.Append(ch);");
                writer.WriteLine("						reader.Read();");
                writer.WriteLine("						n = reader.Peek();");
                writer.WriteLine("						break;");
                writer.WriteLine("					}");
                i++;
            }

            writer.WriteLine("					default:");
            writer.WriteLine("					{");
            writer.WriteLine("						goto EXIT;");
            writer.WriteLine("					}");
            writer.WriteLine("				}");
            writer.WriteLine("			}");
            writer.WriteLine("");
            writer.WriteLine("		EXIT:");
            writer.WriteLine("			switch(state)");
            writer.WriteLine("			{");

            foreach (int finalState in finiteAutomaton.FinalStates)
            {
                Bamboo.Parsing.FiniteAutomata.Token token = GetToken(finalState, finiteAutomaton.Tokens);

                writer.WriteLine("				case "+ finalState + ":");
                writer.WriteLine("				{");
                writer.WriteLine("					return new "+ name + "Token(" + name + "TokenType." + token.Name + ", _stringBuilder.ToString());");
                writer.WriteLine("				}");
            }

            writer.WriteLine("				default:");
            writer.WriteLine("				{");
            writer.WriteLine("					if (n > -1)");
            writer.WriteLine("					{");
            writer.WriteLine("						_stringBuilder.Append(ch);");
            writer.WriteLine("					}");
            writer.WriteLine("					return new "+ name + "Token(" + name + "TokenType._ERROR_, _stringBuilder.ToString());");
            writer.WriteLine("				}");
            writer.WriteLine("			}");
            writer.WriteLine("		}");
            writer.WriteLine("");
            writer.WriteLine("	}");
            writer.WriteLine("}");
        }