add file trace to parser, refactor, fix inner type

This commit is contained in:
Neemek 2025-09-30 14:09:05 +02:00
parent bcf0978b68
commit c8660a6471
Signed by: neemek
GPG key ID: 84FFE4D7D40AB25E
10 changed files with 131 additions and 51 deletions

View file

@ -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,
}
}