bool Accept(params Category[] categories) { foreach (var category in categories) { if(category == token.Category) { accepted = token; GetNextToken (); return true; } } accepted = Token.ErrorToken(); return false; }
void AddError(Token found, params Category[] expected) { string errorMsg = "Expecting " + expected [0]; for (int i=1; i <expected.Length; i++) { errorMsg = errorMsg + " or " + expected[i]; } errorMsg = errorMsg + ", but found " + found.Category; errors.AddError(token, ErrorType.SyntaxError, errorMsg); throw new SyntaxErrorException(); }
void GetNextToken() { if (scanner.HasNext ()) { token = scanner.Next (); } }
public bool IsLocked(Token identifier) { return symbolLock.Contains(identifier.Lexeme); }
public void Lock(Token identifier) { symbolLock.Push(identifier.Lexeme); }
public string GetVariableType(Token identifier) { SymbolTableEntry entry; symbols.TryGetValue(identifier.Lexeme, out entry); return entry.VariableType; }
public bool IsDeclared(Token identifier) { return symbols.ContainsKey(identifier.Lexeme); }
public void Declare(Token identifier, Token type) { Declare (identifier, type, null); }
public object GetValue(Token identifier) { SymbolTableEntry entry; symbols.TryGetValue(identifier.Lexeme, out entry); return entry.Value; }
public void Assign(Token token, object value) { SymbolTableEntry entry; symbols.TryGetValue(token.Lexeme, out entry); entry.Value = value; }
public void Declare(Token identifier, Token type, object value) { symbols.Add(identifier.Lexeme, new SymbolTableEntry( type.Lexeme, value)); }
public void AddError(Token token, ErrorType type, string message) { var err = new ErrorEntry(token, type, message); AddError (err); }
public ErrorEntry(Token token, ErrorType type, string message) { this.NearToken = token; this.Type = type; this.Message = message; }
void ValidateAssignmentAndDoAction(Token identifier, Action action) { if (symbolTable.IsDeclared (identifier)) { if (symbolTable.IsLocked (identifier)) { errors.AddError (identifier, ErrorType.SemanticError, "Variable is being used by a for loop and cannot be assigned to"); } else { //do action if assignment to identifier is valid action(); } } else { errors.AddError (identifier, ErrorType.SemanticError, "Cannot assign to a variable that is undeclared"); } }
/* * Private methods */ Token ScanNextToken() { lexeme = ""; category = Category.NONE; lexemeBeginLine = -1; lexemeBeginColumn = -1; if (charStream.EndOfStream) { throw new EndOfStreamException(); } ReadLexeme (); SkipBlank(); DecideCategory(); Token token = new Token (); token.Lexeme = lexeme; token.Category = category; token.Line = lexemeBeginLine; token.Column = lexemeBeginColumn; return token; }
//give tokens to the builder public void Offer(Token next) { inputStack.Push (next); }