private Environment(AbsMachine machine) { this.parent = null; parameters = new Dictionary <string, AbsType>(); locals = new Dictionary <string, AbsType>(); SentencaImperativa = false; this.machine = machine; // O CodeAddress é inicializado pela ação semântica @MainCode this.returnvalue = null; }
public Environment(Environment parent) { this.parent = parent; this.machine = parent.machine; EntryPoint(); parameters = new Dictionary <string, AbsType>(); locals = new Dictionary <string, AbsType>(); SentencaImperativa = false; this.returnvalue = null; }
public ProcType(Environment env, AbsMachine machine) : base(EnumType.PROC) { Env = new Environment(env); }
public FuncType(Environment env, AbsMachine machine) : base(EnumType.FUNC) { Env = new Environment(env); }
public bool Parse(string text) { Scanner lex = new Scanner(); Semantic sem = new Semantic(); AbsMachine machine = new AbsMachine(); text += "#"; int pos = 0; Stack <Tag> stk = new Stack <Tag>(); // Tabela de Símbolos Principal Environment simbolTable = Environment.root; // Local para introduzir símbolos globais // .... Token previous = null; Token current = lex.NextToken(text, simbolTable, ref pos); // Console.WriteLine(current.ToString()); PushRHS(stk, RHS[0]); while (true) { Tag A = stk.Pop(); if (A.IsVariable()) { int rule = M[(int)A][(int)current.TAG]; if (rule == -1) { line = lex.ErrorLine; return(false); } PushRHS(stk, RHS[rule]); // Attributes adjustment switch (rule) { // 2. <identifier_list'> ::= @Echo . case 2: stk.ElementAt <Tag>(0).Inherited[0] = A.Inherited[0]; break; // 3. <identifier_list'> ::= ',' 'idnew' @InsertList <identifier_list'> . case 3: stk.ElementAt <Tag>(2).Inherited[0] = A.Inherited[0]; break; // 33. <variable'> ::= @Echo . case 33: stk.ElementAt <Tag>(0).Inherited[0] = A.Inherited[0]; break; // 34. <variable'> ::= '[' <simple_expression> @Indexed ']' . case 34: stk.ElementAt <Tag>(2).Inherited[1] = A.Inherited[0]; break; // 39. <expression_list'> ::= @EndActualPar . case 39: stk.ElementAt <Tag>(0).Inherited[0] = A.Inherited[0]; break; // 40. <expression_list'> ::= ',' <expression> @NextActualPar <expression_list'> . case 40: stk.ElementAt <Tag>(2).Inherited[1] = A.Inherited[0]; break; // 42. <expression'> ::= @Echo . case 42: stk.ElementAt <Tag>(0).Inherited[0] = A.Inherited[0]; break; // 43. <expression'> ::= 'relop' @RelOp <simple_expression> @Rel . case 43: stk.ElementAt <Tag>(3).Inherited[2] = A.Inherited[0]; break; // 45. <simple_expression'> ::= @Echo . case 45: stk.ElementAt <Tag>(0).Inherited[0] = A.Inherited[0]; break; // 46. <simple_expression'> ::= 'addop' @AddOp <term> @Add <simple_expression'> . case 46: stk.ElementAt <Tag>(3).Inherited[2] = A.Inherited[0]; break; // 48. <term'> ::= @Echo . case 48: stk.ElementAt <Tag>(0).Inherited[0] = A.Inherited[0]; break; case 49: // 49. <term'> ::= 'mulop' @MulOp <factor> @Mul <term'> . stk.ElementAt <Tag>(3).Inherited[2] = A.Inherited[0]; break; // 57. <varexp> ::= @Echo . case 57: stk.ElementAt <Tag>(0).Inherited[0] = A.Inherited[0]; break; // 58. <varexp> ::= '[' <simple_expression> @FromArray ']' . case 58: stk.ElementAt <Tag>(2).Inherited[1] = A.Inherited[0]; break; default: break; } } else if (A.IsTerminal()) { if (A != current.TAG) { line = lex.ErrorLine; return(false); } if (A == Tag.vtSharp) { return(true); } // pop previous = current; current = lex.NextToken(text, simbolTable, ref pos); // Console.WriteLine(current.ToString()); if (current == Token.UNKNOW) { line = lex.ErrorLine; return(false); } } else { sem.Execute(A, stk, previous, ref simbolTable); } } }