summaryrefslogtreecommitdiff
path: root/scanner/scan.go
diff options
context:
space:
mode:
Diffstat (limited to 'scanner/scan.go')
-rw-r--r--scanner/scan.go20
1 files changed, 11 insertions, 9 deletions
diff --git a/scanner/scan.go b/scanner/scan.go
index edd8b1c..cb1549e 100644
--- a/scanner/scan.go
+++ b/scanner/scan.go
@@ -46,8 +46,10 @@ func (t *Token) Name() string {
func (t *Token) String() string {
s := t.Tok.String()
if t.Tok.IsLiteral() || t.Tok.IsBlock() || t.Tok == lang.Ident || t.Tok == lang.Comment ||
- t.Tok == lang.Period || t.Tok == lang.Label || t.Tok == lang.Goto {
+ t.Tok == lang.Period || t.Tok == lang.Label || t.Tok == lang.Goto || t.Tok == lang.JumpSetFalse || t.Tok == lang.JumpSetTrue || t.Tok == lang.JumpFalse || t.Tok == lang.Colon || t.Tok == lang.Composite {
s += strconv.Quote(t.Str)
+ } else if t.Tok == lang.Call {
+ s += "(" + strconv.Itoa(t.Beg) + ")"
}
return s
}
@@ -119,8 +121,8 @@ func (sc *Scanner) Scan(src string, semiEOF bool) (tokens []Token, err error) {
if len(tokens) > 0 && t.Str == "\n" {
// Check for automatic semi-colon insertion after newline.
last := tokens[len(tokens)-1]
- if last.Tok.IsKeyword() && sc.TokenProps[last.Str].SkipSemi ||
- last.Tok.IsOperator() && !sc.TokenProps[last.Str].SkipSemi {
+ if last.Tok.IsKeyword() && sc.TokenProps[last.Tok].SkipSemi ||
+ last.Tok.IsOperator() && !sc.TokenProps[last.Tok].SkipSemi {
skip = true
} else {
t.Tok = lang.Semicolon
@@ -142,8 +144,8 @@ func (sc *Scanner) Scan(src string, semiEOF bool) (tokens []Token, err error) {
if last.Str == ";" {
return tokens, nil
}
- if last.Tok == lang.Ident && sc.TokenProps[last.Str].SkipSemi ||
- last.Tok.IsOperator() && !sc.TokenProps[last.Str].SkipSemi {
+ if last.Tok == lang.Ident && sc.TokenProps[last.Tok].SkipSemi ||
+ last.Tok.IsOperator() && !sc.TokenProps[last.Tok].SkipSemi {
return tokens, nil
}
tokens = append(tokens, Token{Tok: lang.Semicolon, Str: ";"})
@@ -179,7 +181,7 @@ func (sc *Scanner) Next(src string) (tok Token, err error) {
return Token{}, nil
case sc.isGroupSep(r):
// TODO: handle group separators.
- return Token{Tok: sc.TokenProps[string(r)].Token, Pos: p + i, Str: string(r)}, nil
+ return Token{Tok: sc.Tokens[string(r)], Pos: p + i, Str: string(r)}, nil
case sc.isLineSep(r):
return Token{Pos: p + i, Str: "\n"}, nil
case sc.isStr(r):
@@ -194,12 +196,12 @@ func (sc *Scanner) Next(src string) (tok Token, err error) {
err = ErrBlock
}
tok := Token{Pos: p + i, Str: b, Beg: 1, End: 1}
- tok.Tok = sc.TokenProps[tok.Name()].Token
+ tok.Tok = sc.Tokens[tok.Name()]
return tok, err
case sc.isOp(r):
op, isOp := sc.getOp(src[i:])
if isOp {
- t := sc.TokenProps[op].Token
+ t := sc.Tokens[op]
if t == lang.Illegal {
err = fmt.Errorf("%w: %s", ErrIllegal, op)
}
@@ -218,7 +220,7 @@ func (sc *Scanner) Next(src string) (tok Token, err error) {
default:
t, isDefined := sc.getToken(src[i:])
if isDefined {
- ident := sc.TokenProps[t].Token
+ ident := sc.Tokens[t]
if ident == lang.Illegal {
ident = lang.Ident
}