Beispiel #1
0
 bool Accept(params Category[] categories)
 {
     foreach (var category in categories) {
         if(category == token.Category) {
             accepted = token;
             GetNextToken ();
             return true;
         }
     }
     accepted = Token.ErrorToken();
     return false;
 }
Beispiel #2
0
 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();
 }
Beispiel #3
0
 void GetNextToken()
 {
     if (scanner.HasNext ()) {
         token = scanner.Next ();
     }
 }
Beispiel #4
0
 public bool IsLocked(Token identifier)
 {
     return symbolLock.Contains(identifier.Lexeme);
 }
Beispiel #5
0
 public void Lock(Token identifier)
 {
     symbolLock.Push(identifier.Lexeme);
 }
Beispiel #6
0
 public string GetVariableType(Token identifier)
 {
     SymbolTableEntry entry;
     symbols.TryGetValue(identifier.Lexeme, out entry);
     return entry.VariableType;
 }
Beispiel #7
0
 public bool IsDeclared(Token identifier)
 {
     return symbols.ContainsKey(identifier.Lexeme);
 }
Beispiel #8
0
 public void Declare(Token identifier, Token type)
 {
     Declare (identifier, type, null);
 }
Beispiel #9
0
 public object GetValue(Token identifier)
 {
     SymbolTableEntry entry;
     symbols.TryGetValue(identifier.Lexeme, out entry);
     return entry.Value;
 }
Beispiel #10
0
 public void Assign(Token token, object value)
 {
     SymbolTableEntry entry;
     symbols.TryGetValue(token.Lexeme, out entry);
     entry.Value = value;
 }
Beispiel #11
0
 public void Declare(Token identifier, Token type, object value)
 {
     symbols.Add(identifier.Lexeme, new SymbolTableEntry( type.Lexeme, value));
 }
Beispiel #12
0
 public void AddError(Token token, ErrorType type, string message)
 {
     var err = new ErrorEntry(token, type, message);
     AddError (err);
 }
Beispiel #13
0
 public ErrorEntry(Token token, ErrorType type, string message)
 {
     this.NearToken = token;
     this.Type = type;
     this.Message = message;
 }
Beispiel #14
0
 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");
     }
 }
Beispiel #15
0
        /*
         * 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;
        }
Beispiel #16
0
 //give tokens to the builder
 public void Offer(Token next)
 {
     inputStack.Push (next);
 }