Python 3 interpreter in Go
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

58 lines
1.2 KiB

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()
}