r - ast.go
1 // Package r implements an R tokeniser and parser.
2 package r
3
4 import (
5 "vimagination.zapto.org/parser"
6 )
7
8 // File represents a parsed R file.
9 type File struct {
10 Statements []Expression
11 Comments Comments
12 Tokens Tokens
13 }
14
15 // Parse parses R input into AST.
16 func Parse(t Tokeniser) (*File, error) {
17 r, err := newRParser(t)
18 if err != nil {
19 return nil, err
20 }
21
22 f := new(File)
23 if err = f.parse(&r); err != nil {
24 return nil, err
25 }
26
27 return f, nil
28 }
29
30 func (f *File) parse(r *rParser) error {
31 s := r.NewGoal()
32
33 for s.AcceptRunWhitespace() != parser.TokenDone {
34 r.AcceptRunWhitespaceNoComment()
35
36 var e Expression
37
38 s = r.NewGoal()
39
40 if err := e.parse(&s); err != nil {
41 return r.Error("File", err)
42 }
43
44 f.Statements = append(f.Statements, e)
45
46 r.Score(s)
47 r.AcceptRunWhitespaceNoNewLine()
48
49 if !r.AcceptToken(parser.Token{Type: TokenExpressionTerminator, Data: ";"}) && !r.Accept(TokenLineTerminator) && r.Peek().Type != parser.TokenDone {
50 return r.Error("File", ErrMissingStatementTerminator)
51 }
52
53 s = r.NewGoal()
54 }
55
56 f.Comments = r.AcceptRunWhitespaceComments()
57 f.Tokens = r.ToTokens()
58
59 return nil
60 }
61