From 2d39556a8a07fe3b49f1539cb81caf1dadcb25a6 Mon Sep 17 00:00:00 2001 From: u5surf Date: Thu, 24 Jan 2019 18:34:02 +0900 Subject: [PATCH 1/3] Refactor parsePrefixExpression, block some expressions #189 --- parse/parser.go | 13 +++++++++++++ parse/parser_internal_test.go | 6 +++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/parse/parser.go b/parse/parser.go index 98c3d023..afd12405 100644 --- a/parse/parser.go +++ b/parse/parser.go @@ -18,6 +18,7 @@ package parse import ( "fmt" + "reflect" "strconv" "github.com/DE-labtory/koa/ast" @@ -368,6 +369,18 @@ func parsePrefixExpression(buf TokenBuffer) (ast.Expression, error) { if err != nil { return nil, err } + if exp.Operator != operatorMap[Bang] && reflect.TypeOf(exp.Right).String() == "*ast.BooleanLiteral" { + return nil, parseError{ + tok.Type, + fmt.Sprintf("parsePrefixExpression() - Invalid prefix of %s", exp.Right.String()), + } + } + if exp.Operator == operatorMap[Bang] && reflect.TypeOf(exp.Right).String() == "*ast.StringLiteral" { + return nil, parseError{ + tok.Type, + fmt.Sprintf("parsePrefixExpression() - Invalid prefix of %s", exp.Right.String()), + } + } return exp, nil } diff --git a/parse/parser_internal_test.go b/parse/parser_internal_test.go index df8337cf..eed5942f 100644 --- a/parse/parser_internal_test.go +++ b/parse/parser_internal_test.go @@ -782,14 +782,14 @@ func TestMakePrefixExpression(t *testing.T) { {Type: Minus, Val: "-"}, {Type: True, Val: "true"}, }, - expected: "(-true)", + expectedErr: errors.New("MINUS, parsePrefixExpression() - Invalid prefix of true"), }, { tokens: []Token{ {Type: Bang, Val: "!"}, {Type: String, Val: "hello"}, }, - expected: `(!"hello")`, + expectedErr: errors.New("BANG, parsePrefixExpression() - Invalid prefix of \"hello\""), }, } @@ -797,7 +797,7 @@ func TestMakePrefixExpression(t *testing.T) { buf := &mockTokenBuffer{tt.tokens, 0} exp, err := makePrefixExpression(buf) - if err != nil && err != tt.expectedErr { + if err != nil && err.Error() != tt.expectedErr.Error() { t.Errorf(`test[%d] - Wrong error returned expected="%v", got="%v"`, i, tt.expectedErr, err) continue From cfec506911fbcba4108309827e388c6b49511dd5 Mon Sep 17 00:00:00 2001 From: u5surf Date: Thu, 24 Jan 2019 22:29:35 +0900 Subject: [PATCH 2/3] Refactor validation in parsePrefixExpression #189 --- parse/parser.go | 37 +++++++++++++++++++++---------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/parse/parser.go b/parse/parser.go index afd12405..b33014e7 100644 --- a/parse/parser.go +++ b/parse/parser.go @@ -18,7 +18,6 @@ package parse import ( "fmt" - "reflect" "strconv" "github.com/DE-labtory/koa/ast" @@ -360,28 +359,34 @@ func parseInfixExpression(buf TokenBuffer, left ast.Expression) (ast.Expression, func parsePrefixExpression(buf TokenBuffer) (ast.Expression, error) { var err error tok := buf.Read() - - exp := &ast.PrefixExpression{ - Operator: operatorMap[tok.Type], - } - - exp.Right, err = parseExpression(buf, PREFIX) + op := operatorMap[tok.Type] + right, err := parseExpression(buf, PREFIX) if err != nil { return nil, err } - if exp.Operator != operatorMap[Bang] && reflect.TypeOf(exp.Right).String() == "*ast.BooleanLiteral" { - return nil, parseError{ - tok.Type, - fmt.Sprintf("parsePrefixExpression() - Invalid prefix of %s", exp.Right.String()), + switch op { + case ast.Bang: + switch right.(type) { + case *ast.StringLiteral: + return nil, parseError{ + tok.Type, + fmt.Sprintf("parsePrefixExpression() - Invalid prefix of %s", right.String()), + } } - } - if exp.Operator == operatorMap[Bang] && reflect.TypeOf(exp.Right).String() == "*ast.StringLiteral" { - return nil, parseError{ - tok.Type, - fmt.Sprintf("parsePrefixExpression() - Invalid prefix of %s", exp.Right.String()), + case ast.Minus: + switch right.(type) { + case *ast.BooleanLiteral: + return nil, parseError{ + tok.Type, + fmt.Sprintf("parsePrefixExpression() - Invalid prefix of %s", right.String()), + } } } + exp := &ast.PrefixExpression{ + Operator: op, + Right: right, + } return exp, nil } From 90ef997af3aebb5e20c7f4c95454a8d78763f651 Mon Sep 17 00:00:00 2001 From: u5surf Date: Sat, 26 Jan 2019 22:59:11 +0900 Subject: [PATCH 3/3] Add elements of parseError in parsePrefixExpression #189 --- parse/parser.go | 4 ++++ parse/parser_internal_test.go | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/parse/parser.go b/parse/parser.go index f997e14e..88f3713d 100644 --- a/parse/parser.go +++ b/parse/parser.go @@ -379,6 +379,8 @@ func parsePrefixExpression(buf TokenBuffer) (ast.Expression, error) { return nil, parseError{ tok.Type, fmt.Sprintf("parsePrefixExpression() - Invalid prefix of %s", right.String()), + tok.Line, + tok.Column, } } case ast.Minus: @@ -387,6 +389,8 @@ func parsePrefixExpression(buf TokenBuffer) (ast.Expression, error) { return nil, parseError{ tok.Type, fmt.Sprintf("parsePrefixExpression() - Invalid prefix of %s", right.String()), + tok.Line, + tok.Column, } } } diff --git a/parse/parser_internal_test.go b/parse/parser_internal_test.go index a75b876e..f3d3e9cf 100644 --- a/parse/parser_internal_test.go +++ b/parse/parser_internal_test.go @@ -1008,7 +1008,7 @@ func TestMakePrefixExpression(t *testing.T) { }, 0, }, - expectedErr: errors.New("MINUS, parsePrefixExpression() - Invalid prefix of true"), + expectedErr: errors.New("[line 0, column 0] parsePrefixExpression() - Invalid prefix of true"), }, { buf: &mockTokenBuffer{ @@ -1018,7 +1018,7 @@ func TestMakePrefixExpression(t *testing.T) { }, 0, }, - expectedErr: errors.New("BANG, parsePrefixExpression() - Invalid prefix of \"hello\""), + expectedErr: errors.New("[line 0, column 0] parsePrefixExpression() - Invalid prefix of \"hello\""), }, }