10. Example
public func nextToken() -> Token {
let tokenType: TokenType
switch character {
case "=": // =
tokenType = .assign
case ";": // ;
tokenType = .semicolon
case let character? where isLetter(character): // let, x
tokenType = .identifier
case let character? where isDigit(character): // 5
tokenType = .int
...
}
...
}
11. Sema
let x = 5;
▿ LetStatement
▿ token : Token
- type : Syntax.TokenType.let
- literal : "let"
▿ name : Identifier
▿ token : Token
- type : Syntax.TokenType.identifier
- literal : "x"
▿ value : IntegerLiteral
▿ token : Token
- type : Syntax.TokenType.int
- literal : "5"
- value : 5
12. Example
private func parseLetStatement() -> LetStatement {
// let
let letToken = currentToken
// x
try setNextToken(expects: .identifier)
let name = Identifier(token: currentToken)
// =
try setNextToken(expects: .assign)
// 5
setNextToken()
let value = try parseExpression()
// ;
if isPeekToken(equalTo: .semicolon) {
setNextToken()
}
return LetStatement(token: letToken, name: name, value: value)
}
14. Example
public func evaluate(node: Node) throws -> Object {
switch node {
case let program as Program:
return try evaluate(program: program)
case let expressionStatement as ExpressionStatement:
return try evaluate(node: expressionStatement.expression)
case let letStatement as LetStatement:
let value = try evaluate(node: letStatement.value)
return value
...
}
}