Skip to content

Instantly share code, notes, and snippets.

@kooooohe
kooooohe / parseExpression.go
Last active September 26, 2019 04:43
[Blog][TopDownOperatorPrecedence(再帰下降構文解析)におけるExpression(式)の解析処理を追う]
func (p *Parser) parseExpression(precedence int) ast.Expression {
prefix := p.prefixParseFns[p.curToken.Type]
if prefix == nil {
p.noPrefixParseFnError(p.curToken.Type)
return nil
}
leftExp := prefix()
for !p.peekTokenIs(token.SEMICOLON) && precedence < p.peekPrecedence() {
infix := p.infixParseFns[p.peekToken.Type]
@kooooohe
kooooohe / precedence.go
Created September 26, 2019 04:49
[Blog][TopDownOperatorPrecedence(再帰下降構文解析)におけるExpression(式)の解析処理を追う]precedence.go
const (
LOWEST iota + 1
EQUALS // ==
LESSGRETER // > or <
SUM // +
PRODUCT // *
PREFIX // -X or !X
CALL // myFunction(X)
)
@kooooohe
kooooohe / parseExpression.go
Created September 26, 2019 04:50
[Blog][TopDownOperatorPrecedence(再帰下降構文解析)におけるExpression(式)の解析処理を追う]parseExpression.go
func (p *Parser) parseExpression(precedence int) ast.Expression {
prefix := p.prefixParseFns[p.curToken.Type]
if prefix == nil {
p.noPrefixParseFnError(p.curToken.Type)
return nil
}
leftExp := prefix()
for !p.peekTokenIs(token.SEMICOLON) && precedence < p.peekPrecedence() {
infix := p.infixParseFns[p.peekToken.Type]
@kooooohe
kooooohe / parseExpressionStatement.go
Created September 26, 2019 04:51
[Blog][TopDownOperatorPrecedence(再帰下降構文解析)におけるExpression(式)の解析処理を追う] parseExpressionStatement.go
func (p *Parser) parseExpressionStatement() *ast.ExpressionStatement {
stmt := &ast.ExpressionStatement{Token: p.curToken}
stmt.Expression = p.parseExpression(LOWEST)
if p.peekTokenIs(token.SEMICOLON) {
p.nextToken()
}
return stmt
@kooooohe
kooooohe / parseInfixExpression.go
Created September 26, 2019 04:51
[Blog][TopDownOperatorPrecedence(再帰下降構文解析)におけるExpression(式)の解析処理を追う]precedence.goparseInfixExpression.go
func (p *Parser) parseInfixExpression(left ast.Expression) ast.Expression {
expression := &ast.InfixExpression{
Token: p.curToken,
Operator: p.curToken.Literal,
Left: left,
}
precedence := p.curPrecedence()
p.nextToken()
expression.Right = p.parseExpression(precedence)
@kooooohe
kooooohe / parsePrefixExpression.go
Created September 26, 2019 04:52
[Blog][TopDownOperatorPrecedence(再帰下降構文解析)におけるExpression(式)の解析処理を追う]precedence.go parsePrefixExpression.go
func (p *Parser) parsePrefixExpression() ast.Expression {
expression := &ast.PrefixExpression{
Token: p.curToken,
Operator: p.curToken.Literal,
}
p.nextToken()
expression.Right = p.parseExpression(PREFIX)
@kooooohe
kooooohe / parseIntegerLiteral.go
Created September 26, 2019 04:52
[Blog][TopDownOperatorPrecedence(再帰下降構文解析)におけるExpression(式)の解析処理を追う]precedence.go parseIntegerLiteral.go
func (p *Parser) parseIntegerLiteral() ast.Expression {
lit := &ast.IntegerLiteral{Token: p.curToken}
value, err := strconv.ParseInt(p.curToken.Literal, 0, 64)
if err != nil {
msg := fmt.Sprintf("could not parse %q as integer", p.curToken.Literal)
p.errors = append(p.errors, msg)
return nil
}
lit.Value = value
@kooooohe
kooooohe / called functions
Created September 26, 2019 04:59
[Blog][TopDownOperatorPrecedence(再帰下降構文解析)におけるExpression(式)の解析処理を追う] called functions
BEGIN parseExpresssionStatement
BEGIN parseExpresssion
BEGIN parseIntegerLiteral
END parseIntegerLiteral
BEGIN parseInfixExpression
BEGIN parseExpresssion
BEGIN parseIntegerLiteral
END parseIntegerLiteral
END parseExpresssion
END parseInfixExpression
@kooooohe
kooooohe / tokenprecedences.go
Created September 26, 2019 05:31
[Blog][TopDownOperatorPrecedence(再帰下降構文解析)におけるExpression(式)の解析処理を追う] token precedences
var precedences = map[token.TokenType]int{
token.EQ: EQUALS,
token.NOT_EQ: EQUALS,
token.LT: LESSGRETER,
token.GT: LESSGRETER,
token.PLUS: SUM,
token.MINUS: SUM,
token.SLASH: PRODUCT,
token.ASTERISK: PRODUCT,
}
@kooooohe
kooooohe / medium-blog-cloud-run-docker-compose.js
Last active January 20, 2020 11:36
medium-blog-cloud-run-docker-compose.js
version: "3"
services:
node:
image: node:13
volumes:
- ./app:/app:cached
working_dir: /app
env_file:
- .env
tty: true