Browse Source

properly track line/columns for tokens

master
Brett Langdon 10 years ago
parent
commit
707eb48690
2 changed files with 34 additions and 14 deletions
  1. +15
    -7
      parser/tokenizer.go
  2. +19
    -7
      token/token.go

+ 15
- 7
parser/tokenizer.go View File

@ -24,7 +24,7 @@ type TokenizerState struct {
func newTokenizerState() *TokenizerState { func newTokenizerState() *TokenizerState {
return &TokenizerState{ return &TokenizerState{
curColumn: 1,
curColumn: 0,
curIndent: 0, curIndent: 0,
curLevel: 0, curLevel: 0,
curLine: 1, curLine: 1,
@ -53,6 +53,7 @@ func (tokenizer *TokenizerState) readNext() rune {
next = EOF next = EOF
} }
tokenizer.offset += 1 tokenizer.offset += 1
tokenizer.curColumn += 1
if next != EOF { if next != EOF {
tokenizer.curLiteral += string(next) tokenizer.curLiteral += string(next)
} }
@ -62,6 +63,7 @@ func (tokenizer *TokenizerState) readNext() rune {
func (tokenizer *TokenizerState) unread() error { func (tokenizer *TokenizerState) unread() error {
err := tokenizer.buffer.UnreadRune() err := tokenizer.buffer.UnreadRune()
tokenizer.offset -= 1 tokenizer.offset -= 1
tokenizer.curColumn -= 1
if len(tokenizer.curLiteral) > 0 { if len(tokenizer.curLiteral) > 0 {
tokenizer.curLiteral = tokenizer.curLiteral[0 : len(tokenizer.curLiteral)-1] tokenizer.curLiteral = tokenizer.curLiteral[0 : len(tokenizer.curLiteral)-1]
} }
@ -70,7 +72,8 @@ func (tokenizer *TokenizerState) unread() error {
func (tokenizer *TokenizerState) finalizeToken(tok *token.Token, tokId token.TokenID) *token.Token { func (tokenizer *TokenizerState) finalizeToken(tok *token.Token, tokId token.TokenID) *token.Token {
tok.ID = tokId tok.ID = tokId
tok.End = tokenizer.offset
tok.LineEnd = tokenizer.curLine
tok.ColumnEnd = tokenizer.curColumn
tok.Literal = tokenizer.curLiteral tok.Literal = tokenizer.curLiteral
return tok return tok
} }
@ -78,10 +81,12 @@ func (tokenizer *TokenizerState) finalizeToken(tok *token.Token, tokId token.Tok
func (tokenizer *TokenizerState) newToken() *token.Token { func (tokenizer *TokenizerState) newToken() *token.Token {
tokenizer.curLiteral = "" tokenizer.curLiteral = ""
return &token.Token{ return &token.Token{
ID: token.ERRORTOKEN,
Start: tokenizer.offset,
End: tokenizer.offset - 1,
Literal: tokenizer.curLiteral,
ID: token.ERRORTOKEN,
LineStart: tokenizer.curLine,
ColumnStart: tokenizer.curColumn,
LineEnd: tokenizer.curLine,
ColumnEnd: tokenizer.curColumn,
Literal: tokenizer.curLiteral,
} }
} }
@ -262,7 +267,8 @@ again:
break break
} }
} }
curTok.Start = tokenizer.offset - 1
curTok.LineStart = tokenizer.curLine
curTok.ColumnStart = tokenizer.curColumn - 1
tokenizer.curLiteral = string(nextChar) tokenizer.curLiteral = string(nextChar)
// Skip comments // Skip comments
@ -306,6 +312,8 @@ again:
// Newline // Newline
if nextChar == '\n' { if nextChar == '\n' {
tokenizer.curLine += 1
tokenizer.curColumn = 0
return tokenizer.finalizeToken(curTok, token.NEWLINE) return tokenizer.finalizeToken(curTok, token.NEWLINE)
} }


+ 19
- 7
token/token.go View File

@ -3,22 +3,34 @@ package token
import "fmt" import "fmt"
type Token struct { type Token struct {
End int
ID TokenID
Literal string
Start int
ColumnEnd int
LineEnd int
ID TokenID
Literal string
ColumnStart int
LineStart int
} }
func (token *Token) String() string { func (token *Token) String() string {
return TokenNames[token.ID] return TokenNames[token.ID]
} }
func (token *Token) Start() []int {
return []int{token.LineStart, token.ColumnStart}
}
func (token *Token) End() []int {
return []int{token.LineEnd, token.ColumnEnd}
}
func (token *Token) Repr() string { func (token *Token) Repr() string {
return fmt.Sprintf( return fmt.Sprintf(
"Token{ID: %#v, Literal: %#v, Start: %#v, End: %#v}",
"Token{ID: %#v, Literal: %#v, LineStart: %#v, ColumnStart: %#v, LineEnd: %#v, ColumnEnd: %#v}",
token.ID, token.ID,
token.Literal, token.Literal,
token.Start,
token.End,
token.LineStart,
token.ColumnStart,
token.LineEnd,
token.ColumnEnd,
) )
} }

Loading…
Cancel
Save