add file trace to parser, refactor, fix inner type
This commit is contained in:
parent
bcf0978b68
commit
c8660a6471
10 changed files with 131 additions and 51 deletions
|
|
@ -17,6 +17,7 @@ type ParsingError struct {
|
|||
Description string
|
||||
Causer *Token
|
||||
Source string
|
||||
Trace []string
|
||||
}
|
||||
|
||||
func (p ParsingError) Error() string {
|
||||
|
|
@ -26,7 +27,7 @@ func (p ParsingError) Error() string {
|
|||
// Format Print a rich and informative error
|
||||
func (p ParsingError) Format() string {
|
||||
src := []rune(p.Source)
|
||||
builder := strings.Builder{}
|
||||
b := strings.Builder{}
|
||||
|
||||
lineNumber := 1
|
||||
lineBeginning := 0
|
||||
|
|
@ -46,39 +47,46 @@ func (p ParsingError) Format() string {
|
|||
}
|
||||
|
||||
descriptor := fmt.Sprintf("%d:%d", lineNumber, int(p.Causer.Start)-lineBeginning+1)
|
||||
builder.WriteString(p.Description)
|
||||
builder.WriteRune('\n')
|
||||
b.WriteString(p.Description)
|
||||
b.WriteRune('\n')
|
||||
|
||||
builder.WriteString(descriptor)
|
||||
builder.WriteString(" | ")
|
||||
builder.WriteString(string(src[lineBeginning:lineEnd]))
|
||||
b.WriteString(descriptor)
|
||||
b.WriteString(" | ")
|
||||
b.WriteString(string(src[lineBeginning:lineEnd]))
|
||||
|
||||
builder.WriteString("\n")
|
||||
builder.WriteString(strings.Repeat(" ", len(descriptor)))
|
||||
builder.WriteString(" ")
|
||||
b.WriteString("\n")
|
||||
b.WriteString(strings.Repeat(" ", len(descriptor)))
|
||||
b.WriteString(" ")
|
||||
for i := lineBeginning; i <= int(p.Causer.Start); i++ {
|
||||
builder.WriteRune(' ')
|
||||
b.WriteRune(' ')
|
||||
}
|
||||
|
||||
for i := 0; i < int(p.Causer.Length); i++ {
|
||||
builder.WriteRune('^')
|
||||
b.WriteRune('^')
|
||||
}
|
||||
builder.WriteRune('\n')
|
||||
b.WriteRune('\n')
|
||||
b.WriteRune('\n')
|
||||
|
||||
return builder.String()
|
||||
for i := len(p.Trace) - 1; i >= 0; i-- {
|
||||
b.WriteString(fmt.Sprintf("[%d] %s\n", i, p.Trace[i]))
|
||||
}
|
||||
|
||||
return b.String()
|
||||
}
|
||||
|
||||
type Parser struct {
|
||||
source string
|
||||
trace []string
|
||||
tokens []Token
|
||||
prev *Token
|
||||
curr *Token
|
||||
pos Pos
|
||||
}
|
||||
|
||||
func NewParser(source string, tokens []Token) *Parser {
|
||||
func NewParser(source string, trace []string, tokens []Token) *Parser {
|
||||
return &Parser{
|
||||
source: source,
|
||||
trace: trace,
|
||||
tokens: tokens,
|
||||
pos: 0,
|
||||
}
|
||||
|
|
@ -121,6 +129,7 @@ func (p *Parser) Parse(path string) (*Program, error) {
|
|||
}
|
||||
|
||||
imports = append(imports, p.prev.Lexeme[1:len(p.prev.Lexeme)-1])
|
||||
continue
|
||||
}
|
||||
|
||||
b, err := p.block(true)
|
||||
|
|
@ -190,6 +199,7 @@ func (p *Parser) error(error string, causer *Token) error {
|
|||
Description: error,
|
||||
Causer: causer,
|
||||
Source: p.source,
|
||||
Trace: p.trace,
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue