
Go
学习记录:用 Go 自制解释器 Monkey
本文主要是记录笔者在学习《用 Go 自制解释器 Monkey》过程中涉及的重要设计理念和思考。
词法分析
TDD:测试驱动开发
先写测试用例,再进行词法分析逻辑的完善。
语法分析
递归下降语法分析伪代码
function parseProgram() {
program = newProgramASTNode()
advanceTokens()
for (currentToken() != EOF_TOKEN) {
statement = null
if (currentToken() == LET_TOKEN) {
statement = parseLetStatement()
} else if (currentToken() == RETURN_TOKEN) {
statement = parseReturnStatement()
} else if (currentToken() == IF_TOKEN) {
statement = parseIfStatement()
}
if (statement != null) {
program.Statements.push(statement)
}
advanceTokens()
}
return program
}
function parseLetStatement() {
advanceTokens()
identifier = parseIdentifier()
advanceTokens()
if currentToken() != EQUAL_TOKEN {
parseError("no equal sign!")
return null
}
advanceTokens()
value = parseExpression()
variableStatement = newVariableStatementASTNode()
variableStatement.identifier = identifier
variableStatement.value = value
return variableStatement
}
function parseIdentifier() {
identifier = newIdentifierASTNode()
identifier.token = currentToken()
return identifier
}
function parseExpression() {
if (currentToken() == INTEGER_TOKEN) {
if (nextToken() == PLUS_TOKEN) {
return parseOperatorExpression()
} else if (nextToken() == SEMICOLON_TOKEN) {
return parseIntegerLiteral()
}
} else if (currentToken() == LEFT_PAREN) {
return parseGroupedExpression()
}
// [...]
}
function parseOperatorExpression() {
operatorExpression = newOperatorExpression()
operatorExpression.left = parseIntegerLiteral()
operatorExpression.operator = currentToken()
operatorExpression.right = parseExpression()
return operatorExpression()
}
let x=5
return 5
普拉特解析
来自开放网络的回应
引用、喜欢、转发和站外回复会通过 Webmention 回到这里。
接收与展示代码已经就绪,注册正式域名后即可开始收集回应。
评论
评论由 GitHub Discussions 保存和管理。