From 7bc717e693358e440724d8a2b32829a75f3324fd Mon Sep 17 00:00:00 2001 From: brettlangdon Date: Sun, 13 Sep 2015 13:34:42 -0400 Subject: [PATCH] add start to new scanner --- scanner/position.go | 7 +++++ scanner/scanner.go | 69 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 scanner/position.go create mode 100644 scanner/scanner.go diff --git a/scanner/position.go b/scanner/position.go new file mode 100644 index 0000000..199dccf --- /dev/null +++ b/scanner/position.go @@ -0,0 +1,7 @@ +package scanner + +type Position struct { + Line int + Column int + Char rune +} diff --git a/scanner/scanner.go b/scanner/scanner.go new file mode 100644 index 0000000..7fdb729 --- /dev/null +++ b/scanner/scanner.go @@ -0,0 +1,69 @@ +package scanner + +import ( + "bufio" + "io" + + "github.com/brettlangdon/gython/errorcode" + "github.com/brettlangdon/gython/token" +) + +var EOF rune = 0 +var MAXINDENT int = 100 + +type Scanner struct { + state errorcode.ErrorCode + reader *bufio.Reader + currentPosition *Position + positionBuffer []*Position + + currentLine int + currentColumn int +} + +func NewScanner(r io.Reader) *Scanner { + return &Scanner{ + state: errorcode.E_OK, + reader: bufio.NewReader(r), + positionBuffer: make([]*Position, 0), + currentLine: 1, + currentColumn: 0, + } +} + +func (scanner *Scanner) nextPosition() *Position { + if len(scanner.positionBuffer) > 0 { + last = len(scanner.positionBuffer) - 1 + scanner.currentPosition = scanner.positionBuffer[last] + scanner.positionBuffer = scanner.positionBuffer[0:last] + return scanner.currentPosition + } + + next, _, err := scanner.reader.ReadRune() + if err != nil { + scanner.state = errorcode.E_EOF + next = EOF + } + + scanner.currentColumn++ + if next == '\n' { + scanner.currentLine++ + scanner.currentColumn = 0 + } + + return &Position{ + Char: next, + Line: scanner.currentLine, + Column: scanner.currentColumn, + } +} + +func (scanner *Scanner) unreadPosition(pos *Position) { + scanner.positionBuffer = append(scanner.positionBuffer, pos) +} + +func (scanner *Scanner) NextToken() *token.Token { + return &Token{ + ID: token.ENDMARKER, + } +}