private void handleString() { while (peek() != '"' && !isAtEnd) { if (peek() == '\n') { line++; } advanceScanner(); } if (isAtEnd) { LooxSharp.error(line, "Unterminated string."); return; } //The closing " advanceScanner(); //Remove the " " string value = source.Substring(start + 1, current - start - 2); addToken(TokenType.STRING, value); }
public void interpret(Expr expr) { try { object value = evaluate(expr); Console.WriteLine(stringify(value)); } catch (RuntimeError err) { LooxSharp.runtimeError(err); } }
private void scanToken() { char c = advanceScanner(); switch (c) { //Single characters case '(': addToken(TokenType.LEFT_PARNTH); break; case ')': addToken(TokenType.RIGHT_PARNTH); break; case '{': addToken(TokenType.LEFT_BRACE); break; case '}': addToken(TokenType.RIGHT_BRACE); break; case ',': addToken(TokenType.COMMA); break; case '.': addToken(TokenType.DOT); break; case '-': addToken(TokenType.MINUS); break; case '+': addToken(TokenType.PLUS); break; case ';': addToken(TokenType.SEMICOLON); break; case '*': addToken(TokenType.STAR); break; //Double characters case '!': addToken(match('=') ? TokenType.EXCLAM_EQUAL : TokenType.EXCLAM); break; case '=': addToken(match('=') ? TokenType.EQUAL_EQUAL : TokenType.EQUAL); break; case '<': addToken(match('=') ? TokenType.LESS_EQUAL : TokenType.LESS); break; case '>': addToken(match('=') ? TokenType.GREATER_EQUAL : TokenType.GREATER); break; //Divide and comment case '/': if (match('/')) { while (peek() != '\n' && !isAtEnd) { advanceScanner(); } } else { addToken(TokenType.SLASH); } break; //Whitespace case ' ': break; case '\t': break; case '\r': break; case '\n': line++; break; //Handle strings case '"': handleString(); break; default: //Check for digits (for number literals) if (basicIsDigit(c)) { handleNumber(); } else if (basicIsAlpha(c)) { handleIdentifier(); } else { LooxSharp.error(line, "Unexpected character."); } break; } }
private ParseError error(Token token, string msg) { LooxSharp.error(token, msg); return(new ParseError()); }