mirror of
https://github.com/Kugelschieber/asl.git
synced 2026-01-18 12:00:25 +00:00
Started better error output by adding line and column number. Need to
get rid of panic.
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
package parser
|
package parser
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"strconv"
|
||||||
"tokenizer"
|
"tokenizer"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -37,7 +38,7 @@ func (c *Compiler) accept(token string) bool {
|
|||||||
// Throws if current token does not match expected one.
|
// Throws if current token does not match expected one.
|
||||||
func (c *Compiler) expect(token string) {
|
func (c *Compiler) expect(token string) {
|
||||||
if !c.tokenEqual(token, c.get()) {
|
if !c.tokenEqual(token, c.get()) {
|
||||||
panic("Parse error, expected '" + token + "' but was '" + c.get().Token + "'")
|
panic("Parse error, expected '" + token + "' but was '" + c.get().Token + "' in line "+strconv.Itoa(c.get().Line)+" at "+strconv.Itoa(c.get().Column))
|
||||||
}
|
}
|
||||||
|
|
||||||
c.next()
|
c.next()
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ import (
|
|||||||
type Token struct {
|
type Token struct {
|
||||||
Token string
|
Token string
|
||||||
Preprocessor bool
|
Preprocessor bool
|
||||||
|
Line int
|
||||||
|
Column int
|
||||||
}
|
}
|
||||||
|
|
||||||
var delimiter = []byte{
|
var delimiter = []byte{
|
||||||
@@ -60,10 +62,16 @@ var new_line = []byte{'\r', '\n'}
|
|||||||
func Tokenize(code []byte) []Token {
|
func Tokenize(code []byte) []Token {
|
||||||
code = removeComments(code)
|
code = removeComments(code)
|
||||||
tokens := make([]Token, 0)
|
tokens := make([]Token, 0)
|
||||||
token, mask, isstring := "", false, false
|
token, mask, isstring, line, column := "", false, false, 0, 0
|
||||||
|
|
||||||
for i := 0; i < len(code); i++ {
|
for i := 0; i < len(code); i++ {
|
||||||
c := code[i]
|
c := code[i]
|
||||||
|
column++
|
||||||
|
|
||||||
|
if byteArrayContains(new_line, c) {
|
||||||
|
line++
|
||||||
|
column = 0
|
||||||
|
}
|
||||||
|
|
||||||
// string masks (backslash)
|
// string masks (backslash)
|
||||||
if c == '\\' && !mask {
|
if c == '\\' && !mask {
|
||||||
@@ -84,17 +92,17 @@ func Tokenize(code []byte) []Token {
|
|||||||
} else {
|
} else {
|
||||||
// preprocessor, delimeter, keyword or variable/expression
|
// preprocessor, delimeter, keyword or variable/expression
|
||||||
if c == preprocessor {
|
if c == preprocessor {
|
||||||
tokens = append(tokens, preprocessorLine(code, &i))
|
tokens = append(tokens, preprocessorLine(code, &i, line, column))
|
||||||
token = ""
|
token = ""
|
||||||
} else if byteArrayContains(delimiter, c) {
|
} else if byteArrayContains(delimiter, c) {
|
||||||
if token != "" {
|
if token != "" {
|
||||||
tokens = append(tokens, Token{token, false})
|
tokens = append(tokens, Token{token, false, line, column})
|
||||||
}
|
}
|
||||||
|
|
||||||
tokens = append(tokens, Token{string(c), false})
|
tokens = append(tokens, Token{string(c), false, line, column})
|
||||||
token = ""
|
token = ""
|
||||||
} else if stringArrayContains(strings.ToLower(token)) && !isIdentifierCharacter(c) {
|
} else if stringArrayContains(strings.ToLower(token)) && !isIdentifierCharacter(c) {
|
||||||
tokens = append(tokens, Token{token, false})
|
tokens = append(tokens, Token{token, false, line, column})
|
||||||
token = ""
|
token = ""
|
||||||
} else if !byteArrayContains(whitespace, c) {
|
} else if !byteArrayContains(whitespace, c) {
|
||||||
token += string(c)
|
token += string(c)
|
||||||
@@ -146,7 +154,7 @@ func removeComments(code []byte) []byte {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Reads preprocessor command until end of line
|
// Reads preprocessor command until end of line
|
||||||
func preprocessorLine(code []byte, i *int) Token {
|
func preprocessorLine(code []byte, i *int, lineNr, column int) Token {
|
||||||
c := byte('0')
|
c := byte('0')
|
||||||
var line string
|
var line string
|
||||||
|
|
||||||
@@ -171,7 +179,7 @@ func preprocessorLine(code []byte, i *int) Token {
|
|||||||
|
|
||||||
(*i)-- // for will count up 1, so subtract it here
|
(*i)-- // for will count up 1, so subtract it here
|
||||||
|
|
||||||
return Token{line, true}
|
return Token{line, true, lineNr, column}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns the next character in code starting at i.
|
// Returns the next character in code starting at i.
|
||||||
|
|||||||
Reference in New Issue
Block a user