Browse Source

add start to parser

master
Brett Langdon 10 years ago
parent
commit
fa746cb77e
1 changed files with 58 additions and 0 deletions
  1. +58
    -0
      parser/parser.go

+ 58
- 0
parser/parser.go View File

@ -0,0 +1,58 @@
package parser
import (
"io"
"github.com/brettlangdon/gython/ast"
"github.com/brettlangdon/gython/errorcode"
"github.com/brettlangdon/gython/scanner"
"github.com/brettlangdon/gython/token"
)
type Parser struct {
tokenizer *scanner.Scanner
tokenBuffer []*token.Token
}
func (parser *Parser) nextToken() *token.Token {
if len(parser.tokenBuffer) > 0 {
last := len(parser.tokenBuffer) - 1
next := parser.tokenBuffer[last]
parser.tokenBuffer = parser.tokenBuffer[:last]
return next
}
return parser.tokenizer.NextToken()
}
func (parser *Parser) unreadToken(tok *token.Token) {
parser.tokenBuffer = append(parser.tokenBuffer, tok)
}
func (parser *Parser) parseFileInput() *ast.FileInput {
root := ast.NewFileInput()
for parser.tokenizer.State() == errorcode.E_OK {
next := parser.nextToken()
if next.ID == token.NEWLINE {
root.AppendToken(next)
} else if next.ID == token.ENDMARKER {
break
} else {
parser.unreadToken(next)
// TODO: parser.parseStatement()
break
}
}
return root
}
func ParseReader(r io.Reader) *ast.FileInput {
parser := &Parser{
tokenizer: scanner.NewScanner(r),
tokenBuffer: make([]*token.Token, 0),
}
return parser.parseFileInput()
}

Loading…
Cancel
Save