52 lines
1.3 KiB
Go
52 lines
1.3 KiB
Go
package fsplParser
|
|
|
|
import "io"
|
|
import "fmt"
|
|
import "git.tebibyte.media/fspl/fspl/lexer"
|
|
import "git.tebibyte.media/fspl/fspl/parser"
|
|
|
|
// parser parses tokens from a lexer into syntax entities, which it places into
|
|
// a tree.
|
|
type treeParser struct {
|
|
parser.Parser
|
|
tree *Tree
|
|
skim bool
|
|
}
|
|
|
|
// newParser creates a new parser that parses the output of the given lexer.
|
|
func newParser (lx lexer.Lexer) (*treeParser, error) {
|
|
return &treeParser {
|
|
Parser: parser.Parser {
|
|
Lexer: lx,
|
|
},
|
|
}, nil
|
|
}
|
|
|
|
// parseInto parses the parser's file into the given syntax tree.
|
|
func (this *treeParser) parseInto (tree *Tree) error {
|
|
this.tree = tree
|
|
err := this.parse()
|
|
if err == io.EOF { err = nil }
|
|
return err
|
|
}
|
|
|
|
func (this *treeParser) parse () error {
|
|
err := this.Next()
|
|
if err != nil { return err }
|
|
for this.Token.Kind != lexer.EOF {
|
|
err = this.parseTopLevel()
|
|
if err != nil { return err }
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (this *treeParser) bug () string {
|
|
return fmt.Sprintln (
|
|
"Bug detected in the compiler!\n" +
|
|
"The FSPL parser has taken an unexpected control path.",
|
|
"This could be due to an un-implemented feature.\n" +
|
|
"Please submit a report with this info and stack trace to:",
|
|
"https://git.tebibyte.media/sashakoshka/fspl/issues\n" +
|
|
"The token being parsed was:", this.Token)
|
|
}
|