Parcourir la source

add trace print util

runningwater il y a 3 ans
Parent
commit
4079ca6f5a
3 fichiers modifiés avec 41 ajouts et 0 suppressions
  1. 7 0
      parser/parser.go
  2. 2 0
      parser/parser_test.go
  3. 32 0
      parser/parser_tracing.go

+ 7 - 0
parser/parser.go

@@ -88,6 +88,8 @@ func (p *Parser) parseIdentifier() ast.Expression {
 	return &ast.Identifier{Token: p.curToken, Value: p.curToken.Literal}
 }
 func (p *Parser) parseIntegerLiteral() ast.Expression {
+	defer untrace(trace("parseIntegerLiteral"))
+
 	lit := &ast.IntegerLiteral{Token: p.curToken}
 
 	value, err := strconv.ParseInt(p.curToken.Literal, 0, 64)
@@ -101,6 +103,7 @@ func (p *Parser) parseIntegerLiteral() ast.Expression {
 	return lit
 }
 func (p *Parser) parseInfixExpression(left ast.Expression) ast.Expression {
+	defer untrace(trace("parseInfixExpression"))
 	exp := &ast.InfixExpression{
 		Token:    p.curToken,
 		Left:     left,
@@ -114,6 +117,7 @@ func (p *Parser) parseInfixExpression(left ast.Expression) ast.Expression {
 	return exp
 }
 func (p *Parser) parsePrefixExpression() ast.Expression {
+	defer untrace(trace("parsePrefixExpression"))
 	exp := &ast.PrefixExpression{
 		Token:    p.curToken,
 		Operator: p.curToken.Literal,
@@ -208,6 +212,8 @@ func (p *Parser) parseReturnStatement() *ast.ReturnStatement {
 }
 
 func (p *Parser) parseExpressionStatement() *ast.ExpressionStatement {
+	defer untrace(trace("parseExpressionStatement"))
+
 	stmt := &ast.ExpressionStatement{Token: p.curToken}
 
 	stmt.Expression = p.parseExpression(LOWEST)
@@ -220,6 +226,7 @@ func (p *Parser) parseExpressionStatement() *ast.ExpressionStatement {
 }
 
 func (p *Parser) parseExpression(precedence int) ast.Expression {
+	defer untrace(trace("parseExpression"))
 	prefix := p.prefixParseFns[p.curToken.Type]
 	if prefix == nil {
 		p.noPrefixParseFnError(p.curToken.Type)

+ 2 - 0
parser/parser_test.go

@@ -348,6 +348,7 @@ func TestOperatorPrecedenceParsing(t *testing.T) {
 	}
 
 	for _, tt := range tests {
+		fmt.Printf("=====================================parse %s, begin============================\n", tt.input)
 		l := lexer.New(tt.input)
 		p := New(l)
 		program := p.ParseProgram()
@@ -357,5 +358,6 @@ func TestOperatorPrecedenceParsing(t *testing.T) {
 		if actual != tt.expected {
 			t.Errorf("exptected=%q, got=%q", tt.expected, actual)
 		}
+		fmt.Printf("=====================================parse %s, end============================\n", tt.input)
 	}
 }

+ 32 - 0
parser/parser_tracing.go

@@ -0,0 +1,32 @@
+package parser
+
+import (
+    "fmt"
+    "strings"
+)
+
+var traceLevel = 0
+
+const traceIdentPlaceholder string = "\t"
+
+func identLevel() string {
+    return strings.Repeat(traceIdentPlaceholder, traceLevel-1)
+}
+
+func tracePrint(fs string) {
+    fmt.Printf("%s%s\n", identLevel(), fs)
+}
+
+func incIdent() { traceLevel = traceLevel + 1 }
+func decIdent() { traceLevel = traceLevel - 1 }
+
+func trace(msg string) string {
+    incIdent()
+    tracePrint("BEGIN " + msg)
+    return msg
+}
+
+func untrace(msg string) {
+    tracePrint("END " + msg)
+    decIdent()
+}