词法分析 TDD:测试驱动开发 先写测试用例,再进行词法分析逻辑的完善。 语法分析 递归下降语法分析伪代码 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758function 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 let stmt AST structure return 5 return stmt AST structue 普拉特解析