summaryrefslogtreecommitdiff
path: root/parser/parse.go
diff options
context:
space:
mode:
authorMarc Vertes <mvertes@free.fr>2023-11-10 22:08:46 +0100
committerMarc Vertes <mvertes@free.fr>2023-11-10 22:08:46 +0100
commitbec71a19e7d7cd0847d1cfa6ef2110d7301fcdd1 (patch)
tree7d977e9ad86c119603db88d3fdbf689a845ff8e5 /parser/parse.go
parent5220ccb741c7f3688731d3b3df6e5e851f50f5c5 (diff)
parser: implement support for var declarations
The full Go syntax is supported, blocks or line, mutiple comma separated variables, assignments. In local and global frame.
Diffstat (limited to 'parser/parse.go')
-rw-r--r--parser/parse.go58
1 files changed, 6 insertions, 52 deletions
diff --git a/parser/parse.go b/parser/parse.go
index 40cec5b..a7675b4 100644
--- a/parser/parse.go
+++ b/parser/parse.go
@@ -20,6 +20,7 @@ type Parser struct {
fname string
funcScope string
+ framelen map[string]int // length of function frames indexed by funcScope
labelCount map[string]int
breakLabel string
continueLabel string
@@ -29,55 +30,6 @@ func (p *Parser) Scan(s string, endSemi bool) (Tokens, error) {
return p.Scanner.Scan(s, endSemi)
}
-type Tokens []scanner.Token
-
-func (toks Tokens) String() (s string) {
- for _, t := range toks {
- s += fmt.Sprintf("%#v ", t.Str)
- }
- return s
-}
-
-func (toks Tokens) Index(id lang.TokenId) int {
- for i, t := range toks {
- if t.Id == id {
- return i
- }
- }
- return -1
-}
-
-func (toks Tokens) LastIndex(id lang.TokenId) int {
- for i := len(toks) - 1; i >= 0; i-- {
- if toks[i].Id == id {
- return i
- }
- }
- return -1
-}
-
-func (toks Tokens) Split(id lang.TokenId) (result []Tokens) {
- for {
- i := toks.Index(id)
- if i < 0 {
- return append(result, toks)
- }
- result = append(result, toks[:i])
- toks = toks[i+1:]
- }
-}
-
-func (toks Tokens) SplitStart(id lang.TokenId) (result []Tokens) {
- for {
- i := toks[1:].Index(id)
- if i < 0 {
- return append(result, toks)
- }
- result = append(result, toks[:i])
- toks = toks[i+1:]
- }
-}
-
func (p *Parser) Parse(src string) (out Tokens, err error) {
log.Printf("Parse src: %#v\n", src)
in, err := p.Scan(src, true)
@@ -135,6 +87,8 @@ func (p *Parser) ParseStmt(in Tokens) (out Tokens, err error) {
return p.ParseReturn(in)
case lang.Switch:
return p.ParseSwitch(in)
+ case lang.Var:
+ return p.ParseVar(in)
case lang.Ident:
if len(in) == 2 && in[1].Id == lang.Colon {
return p.ParseLabel(in)
@@ -280,14 +234,15 @@ func (p *Parser) ParseFunc(in Tokens) (out Tokens, err error) {
s.Type = typ
p.function = s
- log.Println("body:", in[len(in)-1].Block())
toks, err := p.Parse(in[len(in)-1].Block())
if err != nil {
return out, err
}
+ if l := p.framelen[p.funcScope] - 1; l > 0 {
+ out = append(out, scanner.Token{Id: lang.Grow, Beg: l})
+ }
out = append(out, toks...)
out = append(out, scanner.Token{Id: lang.Label, Str: fname + "_end"})
- log.Println("symbols", p.symbols)
return out, err
}
@@ -463,7 +418,6 @@ func (p *Parser) ParseReturn(in Tokens) (out Tokens, err error) {
s := p.function
in[0].Beg = s.Type.NumOut()
in[0].End = s.Type.NumIn()
- log.Println("ParseReturn:", p.fname, in[0])
out = append(out, in[0])
return out, err
}