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) { } }
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 }
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); }
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) { } }
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 }
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; //} }
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); }
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(); //} }
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); }
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(); } }
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) { } }
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; } } }
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(); } }
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) { } }