示例#1
0
        public static void Main(string[] args)
        {
            Tokenizer    T     = new Tokenizer(readFile("../../terminals.txt"));
            ShuntingYard N     = new ShuntingYard();
            string       input = "";
            int          i     = 1;

            input = Console.ReadLine();
            Console.WriteLine("Printing out the typed input: " + input);
            T.setInput(input);
            var tok = T.next();

            while (tok.Symbol != "$")
            {
                string entry = "Node" + i.ToString();
                N.addNode(entry, tok);
                if (tok.Symbol == "$")
                {
                    Console.WriteLine("Reached EOF");
                    break;
                }
                Console.WriteLine("Input:\n" + input);
                Console.WriteLine("\tok:" + tok);
                String sym = tok.Symbol;


                tok = T.next();
                i++;
            }
            Console.WriteLine("Printing Nodes:");
            foreach (TreeNode node in N.children)
            {
                Console.WriteLine(" " + node.sym + " tok.sym " + node.token.Symbol);
            }
        }
示例#2
0
        public static void Main(string[] args)
        {
            Tokenizer    T     = new Tokenizer(readFile("../../terminals.txt"));
            ShuntingYard N     = new ShuntingYard();
            string       input = "";
            int          i     = 1;

            input = Console.ReadLine();
            Console.WriteLine("Printing out the typed input: " + input);
            T.setInput(input);
            var tok = T.next();

            while (tok.Symbol != "$")
            {
                //i need to turn entry into precedence
                i = ShuntingYard.precedence(tok.Symbol);
                string precedence = i.ToString();
                N.addNode(precedence, tok);
                if (tok.Symbol == "$")
                {
                    Console.WriteLine("Reached EOF");
                    break;
                }
                tok = T.next();
            }
            Console.WriteLine("Printing Nodes:");
            foreach (TreeNode node in N.children)
            {
                Console.WriteLine(" " + node.sym + " tok.sym " + node.token.Symbol);
            }
        }
        public ShuntingYard(Tokenizer T, string input)
        {
            T.setInput(input);
            Token previous = null;
            Token t        = null;

            while (!(T.atEnd()))
            {
                previous = t;
                t        = T.next();
                if (t.Lexeme == "-")
                {
                    if ((previous == null) || (previous.Symbol == "LPAREN") || (previous.Symbol == "NUM") || (previous.Symbol == "ID"))
                    {
                        t.Symbol = "NEGATE";
                    }
                }
                if ((t.Symbol == "NUM") || (t.Symbol == "ID")) //ID could be variable num is just numbers
                {
                    numStack.Push(new TreeNode(t.Symbol, t));
                }
                else
                {
                    handleOperator(t, operatorStack, numStack);
                }
            }

            while (operatorStack.Count() != 0)  //while not empty
            {
                var opNode = operatorStack.Pop();
                var c1     = numStack.Pop();
                var c2     = numStack.Pop();
                opNode.addChild(c2);
                opNode.addChild(c1);
                //If we got something on the operator stack, +-*, at this point we have an operator that needs dealt with
                //opNode is +, get it's two children, two most recent. Pop those c1 and c2. c2, this is like creating the leaf nodes
                //the thing on numstack that gets pushed is like
                //     +
                //    /  \        <--opNode
                //   1    2
                numStack.Push(opNode);
                Console.WriteLine("numStack Peek" + numStack.Peek().sym);
                // Parse through these nodes and solves
                // if sym opNode
                // At this point we want to check to
                // sym == "ADDOP"
                // c2 + c1
                //
                // COME BACK TO THIS
            }
            // nothing left in operatorStack
            // ALL NODES ARE IN NUMSTACK!
            //Console.WriteLine(numStack.Peek().sym);

            Console.WriteLine(handleNode(numStack.Peek()));
            //Console.WriteLine(handleNode(numStack.Peek().children[0]));
            //Console.WriteLine(handleNode(numStack.Peek().children[1]));
        }
示例#4
0
        public static void Main(string[] args)
        {
            Syms.init("calc.tokens");
            string gdata;

            using (var r = new StreamReader("terminals.txt"))
            {
                gdata = r.ReadToEnd();
            }
            var    tokenizer = new Tokenizer(gdata);
            string idata     = Console.ReadLine();

            tokenizer.setInput(idata);
            IList <IToken> tokens = new List <IToken>();

            while (true)
            {
                Token t = tokenizer.next();
                if (t.Symbol == "$")
                {
                    break;  //at end
                }
                //CommonToken is defined in the ANTLR runtime
                CommonToken T = new CommonToken(Syms.stringToInt[t.Symbol], t.Lexeme);
                T.Line = t.Line;
                tokens.Add(T);
            }
            var antlrtokenizer = new BufferedTokenStream(new ListTokenSource(tokens));
            var parser         = new calcParser(antlrtokenizer);

            parser.BuildParseTree = true;
            //optional: parser.ErrorHandler = new BailErrorStrategy ();
            //'start' should be the name of the grammar's start symbol
            var listener  = new MyListener();
            var walker    = new ParseTreeWalker();
            var antlrroot = parser.start();

            walker.Walk(listener, antlrroot);
            double v = Annotations.ptp.Get(antlrroot);

            Console.WriteLine($"{v}");
        }
示例#5
0
        public static void Main(string[] args)
        {
            Syms.init("ssupl.tokens");

            string gdata;

            using (var r = new StreamReader("terminals.txt"))
            {
                gdata = r.ReadToEnd();
            }
            var tokenizer = new Tokenizer(gdata);

            string idata;

            using (var r = new StreamReader("input.txt"))
            {
                idata = r.ReadToEnd();
            }

            tokenizer.setInput(idata);
            IList <IToken> tokens = new List <IToken>();

            while (true)
            {
                Token t = tokenizer.next();
                //Console.WriteLine("token: " + t);
                if (t.Symbol == "$")
                {
                    break;
                }
                CommonToken T = new CommonToken(Syms.stringToInt[t.Symbol], t.Lexeme);
                T.Line = t.Line;
                tokens.Add(T);
            }


            var antlrtokenizer = new BufferedTokenStream(new ListTokenSource(tokens));
            var parser         = new ssuplParser(antlrtokenizer);

            parser.BuildParseTree = true;
            parser.ErrorHandler   = new BailErrorStrategy();
            var antlrroot = parser.start();

            var listener = new CodeGenerator();
            var walker   = new ParseTreeWalker();

            walker.Walk(listener, antlrroot);
            var allcode = new ASM(
                "default rel",
                "section .text",
                "global main",
                "main:",
                listener.code.Get(antlrroot),
                "section .data");

            //This makes the functions and actual program
            using (var w = new StreamWriter("out.asm"))
            {
                //Console.WriteLine("----------------------------");
                //Console.WriteLine(allcode);
                //Console.WriteLine("----------------------------");
                w.Write(allcode.ToString());
                foreach (var literal in listener.stringPool.Keys)
                {
                    w.WriteLine("; " + literal.Replace("\n", "\\n"));
                    w.WriteLine(listener.stringPool[literal].address + ":");
                    w.Write("db ");
                    byte[] b = Encoding.ASCII.GetBytes(literal);
                    for (int i = 0; i < literal.Length; ++i)
                    {
                        w.Write(b[i]);
                        w.Write(",");
                    }
                    w.WriteLine("0");
                }
            }

            //This makes variables possible in the global data after the program
            //Literally gets append to the bottom of the out.asm file
            var symtable = listener.symtable.table;

            foreach (var sym in symtable)
            {
                //Need dq to have 0,0,0,0 for vec4
                if (sym.Value.type == VarType.VEC4)
                {
                    var globaldata = new ASM(
                        $"{sym.Value.location}:",
                        "dq 0",
                        "dq 0",
                        "dq 0",
                        "dq 0");

                    using (var appendglobals = File.AppendText("out.asm"))
                    {
                        appendglobals.Write(globaldata.ToString());
                    }
                }
                else
                {
                    var globaldata = new ASM(
                        $"{sym.Value.location}:",
                        "dq 0");
                    using (var appendglobals = File.AppendText("out.asm"))
                    {
                        appendglobals.Write(globaldata.ToString());
                    }
                }
            }
        }
示例#6
0
        public static void Main(string[] args)
        {
            Syms.init("ssupl.tokens");

            string gdata;

            using (var r = new StreamReader("terminals.txt"))
            {
                gdata = r.ReadToEnd();
            }
            var tokenizer = new Tokenizer(gdata);

            string idata;

            using (var r = new StreamReader("input.txt"))
            {
                idata = r.ReadToEnd();
            }


            var rex = new Regex(@"\n[ \t]+([^\n]+)");

            idata  = rex.Replace(idata, " $1");
            idata += "\n";

            tokenizer.setInput(idata);
            IList <IToken> tokens = new List <IToken>();

            while (true)
            {
                Token t = tokenizer.next();
                if (t.Symbol == "$")
                {
                    break;
                }
                CommonToken T = new CommonToken(Syms.stringToInt[t.Symbol], t.Lexeme);
                T.Line = t.Line;
                tokens.Add(T);
            }



            var antlrtokenizer = new BufferedTokenStream(new ListTokenSource(tokens));
            var parser         = new ssuplParser(antlrtokenizer);

            parser.BuildParseTree = true;
            parser.ErrorHandler   = new BailErrorStrategy();
            var antlrroot = parser.start();

            var listener = new CodeGenerator();
            var walker   = new ParseTreeWalker();

            walker.Walk(listener, antlrroot);
            var allcode = new ASM(
                "default rel",
                "section .text",
                "global main",
                "main:",
                listener.code.Get(antlrroot),
                "section .data");

            using (var w = new StreamWriter("out.asm"))
            {
                w.Write(allcode.ToString());
            }
        }
示例#7
0
        public ShuntingYard(Tokenizer T, string input)
        {
            T.setInput(input);
            Token previous = null;
            Token t        = null;

            while (!(T.atEnd()))
            {
                previous = t;
                t        = T.next();
                if (t.Lexeme == "-")
                {
                    if ((previous == null) || (previous.Symbol == "LPAREN") || ((previous.Symbol != "NUM") && (previous.Symbol != "ID") && (previous.Symbol != "RPAREN")))
                    {
                        t.Symbol = "NEGATE";
                    }
                }
                if ((t.Symbol == "NUM") || (t.Symbol == "ID")) //ID could be variable num is just numbers
                {
                    numStack.Push(new TreeNode(t.Symbol, t));
                }
                else if (t.Symbol == "LPAREN")
                {
                    operatorStack.Push(new TreeNode(t.Symbol, t));
                }
                else if (t.Symbol == "RPAREN")
                {
                    //Console.WriteLine("HERE");
                    while (operatorStack.Peek().sym.Contains("LPAREN") == false)
                    {
                        var opNode = operatorStack.Pop();
                        var c1     = numStack.Pop();
                        if (opNode.sym != "NEGATE")
                        {
                            var c2 = numStack.Pop();
                            opNode.addChild(c2);
                        }
                        opNode.addChild(c1);
                        numStack.Push(opNode);
                    }
                    operatorStack.Pop();
                }
                else
                {
                    handleOperator(t, operatorStack, numStack);
                }
            }

            while (operatorStack.Count() != 0)  //while not empty m
            {
                var opNode = operatorStack.Pop();
                var c1     = numStack.Pop();
                if (opNode.sym != "NEGATE")
                {
                    var c2 = numStack.Pop();
                    opNode.addChild(c2);
                }
                opNode.addChild(c1);
                numStack.Push(opNode);
            }
            var numNode = numStack.Pop();
            var answer  = handleNode(numNode);

            Console.WriteLine(answer);
        }