예제 #1
0
 public void Visit(NVarDefList node)
 {
     foreach (NVarDef varDef in node)
     {
         semanticAnalyzer.AddGlobalVariable(new VariableSym(varDef.AnchorToken, VariableSymKind.REGULAR));
     }
 }
예제 #2
0
        // Appends NFunDef to nFunDefList
        public void FunDef(NFunDefList nFunDefList)
        {
            NFunDef nFunDef = new NFunDef()
            {
                AnchorToken = Expect(TokenCategory.IDENTIFIER)
            };
            NParameterList nParameterList = new NParameterList();

            Expect(TokenCategory.PARENTHESIS_LEFT);
            if (CurrentToken == TokenCategory.IDENTIFIER)
            {
                nParameterList.Add(new NParameter()
                {
                    AnchorToken = Expect(TokenCategory.IDENTIFIER)
                });
                while (CurrentToken == TokenCategory.COMMA)
                {
                    Expect(TokenCategory.COMMA);
                    nParameterList.Add(new NParameter()
                    {
                        AnchorToken = Expect(TokenCategory.IDENTIFIER)
                    });
                }
            }
            Expect(TokenCategory.PARENTHESIS_RIGHT);
            Expect(TokenCategory.CURLY_BRACE_LEFT);
            NVarDefList nVarDefList = (NVarDefList)VarDefList();
            NStmtList   nStmtList   = (NStmtList)StmtList();

            Expect(TokenCategory.CURLY_BRACE_RIGHT);
            nFunDef.Add(nParameterList);
            nFunDef.Add(nVarDefList);
            nFunDef.Add(nStmtList);
            nFunDefList.Add(nFunDef);
        }
예제 #3
0
//-----------------------------------------------------------
        public void Visit(NVarDefList node)
        {
            Console.WriteLine($"+++++++++++++++ NVARDEFLSIT ++++++++++++++++");
            //Console.WriteLine($"n0: ${node.GetType()}");

            variablePosition = 0;

            VisitChildren(node);
        }
예제 #4
0
        // Returns NVarDefList
        public Node VarDefList()
        {
            NVarDefList nVarDefList = new NVarDefList();

            while (CurrentToken == TokenCategory.VAR)
            {
                VarDef(nVarDefList);
            }
            return(nVarDefList);
        }
예제 #5
0
        public string Visit(NVarDefList nVarDefList)
        {
            string retVal = "";

            foreach (NVarDef nVarDef in nVarDefList)
            {
                retVal += Visit((dynamic)nVarDef);
            }
            return(retVal);
        }
예제 #6
0
        //-----------------------------------------------------------

        public string Visit(NProgram nProgram)
        {
            NVarDefList nVarDefList = (NVarDefList)nProgram[0];
            NFunDefList nFunDefList = (NFunDefList)nProgram[1];

            return("// Code generated by the int64 compiler.\n\n"
                   + ".assembly 'int64' {}\n\n"
                   + ".assembly extern 'int64lib' {}\n\n"
                   + ".class public 'Int64Program' extends ['mscorlib']'System'.'Object' {\n"
                   + Visit((dynamic)nVarDefList)
                   + Visit((dynamic)nFunDefList)
                   + "}\n");
        }
예제 #7
0
//-----------------------------------------------------------
        public void Visit(NVarDefList node)
        {
            Console.WriteLine($"+++++++++++++++ NVARDEFLSIT ++++++++++++++++");
            //Console.WriteLine($"n0: ${node.GetType()}");

            variablePosition = 0;

            if (pasones == 3)
            {
                var final     = (Table[nombreFuncion].locTable).Count;
                var contExtra = 1;
                if (nombreFuncion == "main")
                {
                    File.AppendAllText(lePatheo,
                                       @".entrypoint
              .locals init (
              ");
                }
                else
                {
                    File.AppendAllText(lePatheo,
                                       @"
              .locals init (
              ");
                }

                foreach (var XXX in Table[nombreFuncion].locTable)
                {
                    if (final == contExtra)
                    {
                        File.AppendAllText(lePatheo,
                                           $@"{XXX.Value.name}");
                    }
                    else
                    {
                        File.AppendAllText(lePatheo,
                                           $@"{XXX.Value.name}, ");
                    }

                    contExtra++;
                }

                File.AppendAllText(lePatheo,
                                   @")
        ");
            }
            else
            {
                VisitChildren(node);
            }
        }
예제 #8
0
        // Appends NVarDef to nVarDefList
        public void VarDef(NVarDefList nVarDefList)
        {
            NVarDef nVarDef = new NVarDef();

            Expect(TokenCategory.VAR);
            nVarDef.AnchorToken = Expect(TokenCategory.IDENTIFIER);
            nVarDefList.Add(nVarDef);
            while (CurrentToken == TokenCategory.COMMA)
            {
                Expect(TokenCategory.COMMA);
                NVarDef otherNVarDef = new NVarDef();
                otherNVarDef.AnchorToken = Expect(TokenCategory.IDENTIFIER);
                nVarDefList.Add(otherNVarDef);
            }
            Expect(TokenCategory.SEMICOLON);
        }
예제 #9
0
//-----------------------------------------------------------
        public void Visit(NVarDefList node)
        {
            Console.WriteLine($"+++++++++++++++ NVARDEFLSIT ++++++++++++++++");
            //Console.WriteLine($"n0: ${node.GetType()}");

            variablePosition = 0;
            File.AppendAllText(lePatheo,
                               @".locals init (
          ");

            VisitChildren(node);

            File.AppendAllText(lePatheo,
                               @")
        ");
        }
예제 #10
0
        // Returns NProgram
        public Node Program()
        {
            NProgram    nProgram    = new NProgram();
            NVarDefList nVarDefList = new NVarDefList();
            NFunDefList nFunDefList = new NFunDefList();

            while (firstOfProgram.Contains(CurrentToken))
            {
                if (CurrentToken == TokenCategory.VAR)
                {
                    VarDef(nVarDefList);
                }
                else if (CurrentToken == TokenCategory.IDENTIFIER)
                {
                    FunDef(nFunDefList);
                }
                else if (CurrentToken == TokenCategory.EOF)
                {
                    break;
                }
                else
                {
                    throw new SyntaxError(firstOfProgram, tokenStream.Current);
                }
            }
            if (!firstOfProgram.Contains(CurrentToken))
            {
                throw new SyntaxError(new HashSet <TokenCategory>()
                {
                    TokenCategory.IDENTIFIER,
                    TokenCategory.VAR,
                    TokenCategory.EOF
                }
                                      , tokenStream.Current);
            }
            nProgram.Add(nVarDefList);
            nProgram.Add(nFunDefList);
            return(nProgram);
        }