diff options
Diffstat (limited to 'parser')
| -rw-r--r-- | parser/parser.go | 10 | ||||
| -rw-r--r-- | parser/parser_tracing.go | 37 |
2 files changed, 47 insertions, 0 deletions
diff --git a/parser/parser.go b/parser/parser.go index 6645da1..a2ea590 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -139,6 +139,8 @@ func (p *Parser) parseIdentifier() ast.Expression { // parseIntegerLiteral parses an integer literal. func (p *Parser) parseIntegerLiteral() ast.Expression { + defer untrace(trace("parseIntegerLiteral")) + var lit *ast.IntegerLiteral = &ast.IntegerLiteral{Token: p.curToken} var value, err = strconv.ParseInt(p.curToken.Literal, 0, 64) @@ -195,6 +197,8 @@ func (p *Parser) parseReturnStatement() *ast.ReturnStatement { // parseExpressionStatement parses an expression statement. func (p *Parser) parseExpressionStatement() *ast.ExpressionStatement { + defer untrace(trace("parseExpressionStatement")) + var stmt *ast.ExpressionStatement = &ast.ExpressionStatement{Token: p.curToken} stmt.Expression = p.parseExpression(LOWEST) @@ -215,6 +219,8 @@ func (p *Parser) noPrefixParseFnError(t tokens.TokenType) { // parseExpression parses an expression. func (p *Parser) parseExpression(precedence int) ast.Expression { + defer untrace(trace("parseExpression")) + prefix := p.prefixParseFns[p.curToken.Type] if prefix == nil { @@ -242,6 +248,8 @@ func (p *Parser) parseExpression(precedence int) ast.Expression { // parsePrefixExpression parses a prefix expression. func (p *Parser) parsePrefixExpression() ast.Expression { + defer untrace(trace("parsePrefixExpression")) + var expression *ast.PrefixExpression = &ast.PrefixExpression{ Token: p.curToken, Operator: p.curToken.Literal, @@ -256,6 +264,8 @@ func (p *Parser) parsePrefixExpression() ast.Expression { // parseInfixExpression parses an infix expression. func (p *Parser) parseInfixExpression(left ast.Expression) ast.Expression { + defer untrace(trace("parseInfixExpression")) + expression := &ast.InfixExpression{ Token: p.curToken, Operator: p.curToken.Literal, diff --git a/parser/parser_tracing.go b/parser/parser_tracing.go new file mode 100644 index 0000000..a0819da --- /dev/null +++ b/parser/parser_tracing.go @@ -0,0 +1,37 @@ +package parser + +import ( + "fmt" + "strings" +) + +var traceLevel int = 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() +}
\ No newline at end of file |
