Ejemplo n.º 1
0
        public override void Parse()
        {
            try
            {
                ConsumeCurrentToken(); //skip var
                OnParse();

                for (; ;)
                {
                    var token = CurrentToken();

                    if (token.m_Text == ",")
                    {
                        ConsumeCurrentToken();//skip ,
                        OnParse();
                    }
                    else if (token.m_Text == ";")
                    {
                        ConsumeCurrentToken();//skip ;
                        break;
                    }
                    else
                    {
                        //TODO: error
                        ErrorReporter.RecordError(0, m_Scanner.m_CurrentToken.m_LineNumber);
                        throw new Exception();
                    }
                }
            }
            catch (Exception)
            {
            }
        }
Ejemplo n.º 2
0
        public void OnParse()
        {
            //
            var local = m_SymbolTableStack.GetLocalSymbolTable();

            //
            var token = CurrentToken();

            if ((token as PascalToken).GetType() != PascalTokenType.Identifier)
            {
                //TODO: error
                ErrorReporter.RecordError(16, m_Scanner.m_CurrentToken.m_LineNumber);
                throw new Exception();
            }

            var result = m_SymbolTableStack.LookupLocal(token.m_Text);

            if (result != null)
            {
                //TODO: error
                ErrorReporter.RecordError(17, m_Scanner.m_CurrentToken.m_LineNumber);
                throw new Exception();
            }

            // if not in table
            local.Enter(token.m_Text);
            var item = local.Lookup(token.m_Text) as SymbolTableEntry;

            item.SetAttribute(SymbolTableAttributeKeyType.Offset, (local as SymbolTable).m_VariableAmount + 3);
            item.SetAttribute(SymbolTableAttributeKeyType.Type, SymbolTableEntryType.Variable);
            ++(local as SymbolTable).m_VariableAmount;

            ConsumeCurrentToken();//skip to next
        }
Ejemplo n.º 3
0
        public override void Parse()
        {
            var token = CurrentToken();


            var result = m_SymbolTableStack.Lookup(token.m_Text);

            if (result == null)
            {
                //TODO: error
                ErrorReporter.RecordError(12, m_Scanner.m_CurrentToken.m_LineNumber);
                return;
            }
            else
            {
                var type = (SymbolTableEntryType)(result as SymbolTableEntry).GetAttribute(SymbolTableAttributeKeyType.Type);
                if (type != SymbolTableEntryType.Variable)
                {
                    //TODO: error
                    ErrorReporter.RecordError(13, m_Scanner.m_CurrentToken.m_LineNumber);
                    return;
                }
            }

            var current_nesting_level   = m_SymbolTableStack.GetCurrentNestingLevel();
            var reference_nesting_level = result.GetSymbolTable().GetNestingLevel();

            int offset = (int)(result as SymbolTableEntry).GetAttribute(SymbolTableAttributeKeyType.Offset);


            token = NextToken();
            if (token.m_Text != ":=")
            {
                //TODO: error
                ErrorReporter.RecordError(11, m_Scanner.m_CurrentToken.m_LineNumber);
                return;
            }

            ConsumeCurrentToken();//skip :=


            var expression_parser = new ExpressionParser(this);

            expression_parser.Parse();


            //token = CurrentToken();
            //if (token.m_Text != ";")
            //{
            //    //TODO: error
            //}

            //ConsumeCurrentToken();

            CodeGenerator.Emit(Operation.Store, current_nesting_level - reference_nesting_level, offset);
        }
Ejemplo n.º 4
0
        public override void Parse()
        {
            // <condition> JPC <then-statement1> JMP label_JPC <else-statement> label_JMP

            try
            {
                ConsumeCurrentToken();//skip if

                var condition_parser = new ConditionParser(this);
                condition_parser.Parse();

                var token = CurrentToken();
                if (token.m_Text != "then")
                {
                    //TODO: error
                    ErrorReporter.RecordError(22, m_Scanner.m_CurrentToken.m_LineNumber);
                    throw new Exception();
                }
                ConsumeCurrentToken();//skip then

                //
                CodeGenerator.Emit(Operation.ConditionalJump, 0, 0); //default 0
                int JPC = CodeGenerator.m_Code.Count - 1;            //label1 is the address of JPC 0 ...

                //
                var statement_parser = new StatementParser(this);
                statement_parser.Parse();

                CodeGenerator.Emit(Operation.Jump, 0, 0);       //default 0
                int JMP       = CodeGenerator.m_Code.Count - 1; //label1 is the address of JMP 0 ...
                int label_JPC = CodeGenerator.m_Code.Count;
                CodeGenerator.Refine(JPC, label_JPC);

                token = CurrentToken();
                if (token.m_Text == "else")
                {
                    ConsumeCurrentToken();//skip then
                    statement_parser = new StatementParser(this);
                    statement_parser.Parse();

                    int label_JMP = CodeGenerator.m_Code.Count;
                    CodeGenerator.Refine(JMP, label_JMP);
                }
                else
                {
                    CodeGenerator.Refine(JMP, label_JPC);
                }
            }
            catch (Exception)
            {
            }
        }
Ejemplo n.º 5
0
        public void OnParse()
        {
            //
            var local = m_SymbolTableStack.GetLocalSymbolTable();

            //
            var token = CurrentToken();

            if ((token as PascalToken).GetType() != PascalTokenType.Identifier)
            {
                //TODO: error
                ErrorReporter.RecordError(18, m_Scanner.m_CurrentToken.m_LineNumber);
                throw new Exception();
            }

            var result = m_SymbolTableStack.LookupLocal(token.m_Text);

            if (result != null)
            {
                //TODO: error
                ErrorReporter.RecordError(19, m_Scanner.m_CurrentToken.m_LineNumber);
                throw new Exception();
            }

            // if not in table
            local.Enter(token.m_Text);
            var item = local.Lookup(token.m_Text) as SymbolTableEntry;

            // skip =
            token = NextToken();
            if (token.m_Text != "=")
            {
                //TODO: error
                ErrorReporter.RecordError(20, m_Scanner.m_CurrentToken.m_LineNumber);
                throw new Exception();
            }

            token = NextToken();
            if ((token as PascalToken).GetType() != PascalTokenType.Unsigned)
            {
                //TODO: error
                ErrorReporter.RecordError(21, m_Scanner.m_CurrentToken.m_LineNumber);
                throw new Exception();
            }
            item.SetAttribute(SymbolTableAttributeKeyType.ConstantValue, token.m_Value);
            item.SetAttribute(SymbolTableAttributeKeyType.Type, SymbolTableEntryType.Constant);

            ConsumeCurrentToken();// skip const value
        }
Ejemplo n.º 6
0
        public override void Parse()
        {
            ConsumeCurrentToken(); //skip call

            var token = CurrentToken();

            if ((PascalTokenType)token.m_Type != PascalTokenType.Identifier)
            {
                //TODO: error
                ErrorReporter.RecordError(6, m_Scanner.m_CurrentToken.m_LineNumber);
                return;
            }

            var result = m_SymbolTableStack.Lookup(token.m_Text);

            //TODO: if type is proceduer? what happen if identifier name is the same as procedure?
            if (result == null)
            {
                //TODO: error
                ErrorReporter.RecordError(7, m_Scanner.m_CurrentToken.m_LineNumber);
                return;
            }
            else
            {
                var type = (SymbolTableEntryType)(result as SymbolTableEntry).GetAttribute(SymbolTableAttributeKeyType.Type);
                if (type != SymbolTableEntryType.Procedure)
                {
                    //TODO: error
                    ErrorReporter.RecordError(8, m_Scanner.m_CurrentToken.m_LineNumber);
                    return;
                }
            }

            var current_nesting_level   = m_SymbolTableStack.GetCurrentNestingLevel();
            var reference_nesting_level = result.GetSymbolTable().GetNestingLevel();
            int address = (int)(result as SymbolTableEntry).GetAttribute(SymbolTableAttributeKeyType.Address);

            CodeGenerator.Emit(Operation.Call, current_nesting_level - reference_nesting_level, address);

            //
            token = NextToken();//skip proceduer name
            //if (token.m_Text != ";")
            //{
            //    //TODO: error
            //    ErrorReporter.RecordError(9, m_Scanner.m_CurrentToken.m_LineNumber);
            //    return;
            //}
        }
Ejemplo n.º 7
0
        public override void Parse()
        {
            var token = CurrentToken();

            if (token.m_Text == "odd")
            {
                try
                {
                    ParseOdd();
                }
                catch (Exception)
                {
                }

                return;
            }

            // parse one expression
            var expression1_parser = new ExpressionParser(this);

            expression1_parser.Parse();

            // parse operator
            token = CurrentToken();
            Operation op = Operation.Null;

            try
            {
                op = m_TokenOperationMap[(PascalTokenType)token.m_Type];
            }
            catch (Exception)
            {
                //TODO: error
                ErrorReporter.RecordError(10, m_Scanner.m_CurrentToken.m_LineNumber);
                IsValid = false;
                return;
            }

            ConsumeCurrentToken();//skip operator

            // parse another expression
            var expression2_parser = new ExpressionParser(this);

            expression2_parser.Parse();

            //
            CodeGenerator.Emit(op);
        }
Ejemplo n.º 8
0
        public override void Parse()
        {
            try
            {
                ParseHead();

                //
                (m_SymbolTableStack as SymbolTableStack).Push();

                var program_parser = new ProgramParser(this);
                program_parser.Parse();

                (m_SymbolTableStack as SymbolTableStack).Pop();

                var token = CurrentToken();
                if (token.m_Text != ";")
                {
                    //TODO: error
                    ErrorReporter.RecordError(9, m_Scanner.m_CurrentToken.m_LineNumber);
                    throw new Exception();
                }

                //
                ConsumeCurrentToken();//skip ;
            }
            catch (Exception)
            {
            }

            //if ((PascalTokenType)token.m_Type == PascalTokenType.Procedure)
            //{
            //    //
            //    (m_SymbolTableStack as SymbolTableStack).Push();

            //    var proceduer_parser = new ProcedureParser(this);
            //    proceduer_parser.Parse();

            //    //
            //    SymbolTablePrinter.RecordSymbolTable(m_SymbolTableStack.GetLocalSymbolTable());
            //    (m_SymbolTableStack as SymbolTableStack).Pop();
            //}
        }
Ejemplo n.º 9
0
        private bool OnParse()
        {
            var token = CurrentToken();
            //
            var result = m_SymbolTableStack.Lookup(token.m_Text);

            if (result == null)
            {
                //TODO: error
                ErrorReporter.RecordError(4, m_Scanner.m_CurrentToken.m_LineNumber);
                return(false);
            }

            var type = (result as SymbolTableEntry).GetAttribute(SymbolTableAttributeKeyType.Type);


            switch (type)
            {
            case SymbolTableEntryType.Variable:
                var current_nesting_level   = m_SymbolTableStack.GetCurrentNestingLevel();
                var reference_nesting_level = result.GetSymbolTable().GetNestingLevel();
                int offset = (int)(result as SymbolTableEntry).GetAttribute(SymbolTableAttributeKeyType.Offset);
                CodeGenerator.Emit(Operation.LoadVariable, current_nesting_level - reference_nesting_level, offset);
                CodeGenerator.Emit(Operation.Write);
                break;

            case SymbolTableEntryType.Constant:
                int value = (int)(result as SymbolTableEntry).GetAttribute(SymbolTableAttributeKeyType.ConstantValue);
                CodeGenerator.Emit(Operation.LoadLiteral, 0, value);
                CodeGenerator.Emit(Operation.Write);
                break;

            default:
                //TODO: error
                ErrorReporter.RecordError(2, m_Scanner.m_CurrentToken.m_LineNumber);
                return(false);
            }

            ConsumeCurrentToken();//skip current variable
            return(true);
        }
Ejemplo n.º 10
0
        private void ParseHead()
        {
            ConsumeCurrentToken(); //skip procedure

            var token = CurrentToken();

            if ((PascalTokenType)token.m_Type != PascalTokenType.Identifier)
            {
                //TODO: error
                ErrorReporter.RecordError(14, m_Scanner.m_CurrentToken.m_LineNumber);
                throw new Exception();
            }

            // enter procedure in symbol table

            // if not in table
            var result = m_SymbolTableStack.LookupLocal(token.m_Text);

            if (result != null)
            {
                //TODO: error
                ErrorReporter.RecordError(15, m_Scanner.m_CurrentToken.m_LineNumber);
                throw new Exception();
            }

            m_SymbolTableStack.EnterLocalSymbolTable(token.m_Text);

            var item = m_SymbolTableStack.LookupLocal(token.m_Text) as SymbolTableEntry;

            item.SetAttribute(SymbolTableAttributeKeyType.Address, CodeGenerator.m_Code.Count + 1);
            item.SetAttribute(SymbolTableAttributeKeyType.Type, SymbolTableEntryType.Procedure);

            token = NextToken();//skip proceduer name
            if (token.m_Text != ";")
            {
                //TODO: error
                ErrorReporter.RecordError(9, m_Scanner.m_CurrentToken.m_LineNumber);
                throw new Exception();
            }
        }
Ejemplo n.º 11
0
        public override void Parse()
        {
            try
            {
                ConsumeCurrentToken();//skip repeat

                int label_JPC = CodeGenerator.m_Code.Count;

                OnParse();

                for (; ;)
                {
                    var token = CurrentToken();
                    if (token.m_Text == ";")
                    {
                        ConsumeCurrentToken();//skip ;
                        OnParse();
                    }
                    else if (token.m_Text == "until")
                    {
                        ConsumeCurrentToken();//skip until

                        var condition_parser = new ConditionParser(this);
                        condition_parser.Parse();

                        CodeGenerator.Emit(Operation.ConditionalJump, 0, label_JPC);
                        return;
                    }
                    else
                    {
                        //TODO: error
                        ErrorReporter.RecordError(0, m_Scanner.m_CurrentToken.m_LineNumber);
                        throw new Exception();
                    }
                }
            }
            catch (Exception)
            {
            }
        }
Ejemplo n.º 12
0
        public override void Parse()
        {
            ConsumeCurrentToken();//skip read

            //
            var token = CurrentToken();

            if (token.m_Text != "(")
            {
                //TODO: error
                ErrorReporter.RecordError(1, m_Scanner.m_CurrentToken.m_LineNumber);
                return;
            }
            ConsumeCurrentToken();//skip (

            for (; ;)
            {
                token = CurrentToken();

                if (token.m_Text == ";")
                {
                    //TODO: error
                    ErrorReporter.RecordError(5, m_Scanner.m_CurrentToken.m_LineNumber);
                    return;
                }
                else if (token.m_Text == ")")
                {
                    ConsumeCurrentToken();//skip )
                    break;
                }
                else if ((token as PascalToken).GetType() != PascalTokenType.Identifier)
                {
                    //TODO: error
                    ErrorReporter.RecordError(3, m_Scanner.m_CurrentToken.m_LineNumber);
                    return;
                }

                if (OnParse() != true)
                {
                    return;
                }

                token = CurrentToken();
                if (token.m_Text == ",")
                {
                    ConsumeCurrentToken();//skip ,

                    if (OnParse() != true)
                    {
                        return;
                    }
                }
                else if (token.m_Text == ")")
                {
                    ConsumeCurrentToken();//skip )
                    return;
                }
                else
                {
                    //TODO: error
                    ErrorReporter.RecordError(0, m_Scanner.m_CurrentToken.m_LineNumber);
                    return;
                }
            }
        }
Ejemplo n.º 13
0
        private void ParseFactor()
        {
            var token = CurrentToken();

            switch (token.m_Type)
            {
            case PascalTokenType.Unsigned:
                int value = (int)token.m_Value;
                CodeGenerator.Emit(Operation.LoadLiteral, 0, value);
                ConsumeCurrentToken();
                break;

            case PascalTokenType.Identifier:
                var result = m_SymbolTableStack.Lookup(token.m_Text);
                if (result == null)
                {
                    //TODO: error
                    ErrorReporter.RecordError(4, m_Scanner.m_CurrentToken.m_LineNumber);
                    throw new Exception();
                }

                var type = (result as SymbolTableEntry).GetAttribute(SymbolTableAttributeKeyType.Type);
                switch (type)
                {
                case SymbolTableEntryType.Constant:
                    int const_value = (int)(result as SymbolTableEntry).GetAttribute(SymbolTableAttributeKeyType.ConstantValue);
                    CodeGenerator.Emit(Operation.LoadLiteral, 0, const_value);
                    break;

                case SymbolTableEntryType.Variable:
                    var current_nesting_level   = m_SymbolTableStack.GetCurrentNestingLevel();
                    var reference_nesting_level = result.GetSymbolTable().GetNestingLevel();
                    int offset = (int)(result as SymbolTableEntry).GetAttribute(SymbolTableAttributeKeyType.Offset);
                    CodeGenerator.Emit(Operation.LoadVariable, current_nesting_level - reference_nesting_level, offset);
                    break;

                default:
                    break;
                }
                ConsumeCurrentToken();
                break;

            case PascalTokenType.LeftParenthesis:

                ConsumeCurrentToken();    //skip (
                var expression_parser = new ExpressionParser(this);
                expression_parser.ParseExpression();

                token = CurrentToken();
                if (token.m_Text != ")")
                {
                    //TODO: error
                    ErrorReporter.RecordError(5, m_Scanner.m_CurrentToken.m_LineNumber);
                    throw new Exception();
                }

                ConsumeCurrentToken();    //skip )

                break;

            default:
                //TODO: error
                ErrorReporter.RecordError(0, m_Scanner.m_CurrentToken.m_LineNumber);
                throw new Exception();
            }
        }
Ejemplo n.º 14
0
        public override void Parse()
        {
            try
            {
                var token = CurrentToken();
                switch (token.m_Type)
                {
                case PascalTokenType.Begin:
                    var compound_parser = new CompoundParser(this);
                    compound_parser.Parse();
                    break;

                case PascalTokenType.Identifier:
                    var assignment_parser = new AssignmentParser(this);
                    assignment_parser.Parse();
                    break;

                case PascalTokenType.If:
                    var if_parser = new IfStatementParser(this);
                    if_parser.Parse();
                    break;

                case PascalTokenType.Call:
                    var procedure_parser = new ProcedureParser(this);
                    procedure_parser.Parse();
                    break;

                case PascalTokenType.While:
                    var while_parser = new WhileStatementParser(this);
                    while_parser.Parse();
                    break;

                case PascalTokenType.Read:
                    var read_parser = new ReadParser(this);
                    read_parser.Parse();
                    break;

                case PascalTokenType.Write:
                    var write_parser = new WriteParser(this);
                    write_parser.Parse();
                    break;

                case PascalTokenType.Repeat:
                    var repeat_parser = new RepeatStatementParser(this);
                    repeat_parser.Parse();
                    break;

                //case PascalTokenType.Semicolon:
                //    ConsumeCurrentToken();
                //    break;

                default:
                    if (!FollowStatement.Contains(token.m_Text))
                    {
                        //TODO: error
                        ErrorReporter.RecordError(0, m_Scanner.m_CurrentToken.m_LineNumber, ",possibility: missing ;");
                        throw new Exception();
                    }
                    break;
                }
            }
            catch (Exception)
            {
            }
        }