From a3857c4e90fa4a3fbe78bd4b53cdc77aa91533cf Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Sat, 26 Aug 2017 21:36:08 +0200 Subject: pkg/compiler, sys/syz-sysgen: move const handling to pkg/compiler Now pkg/compiler deals with consts. --- pkg/ast/parser.go | 42 +++++++++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 17 deletions(-) (limited to 'pkg/ast/parser.go') diff --git a/pkg/ast/parser.go b/pkg/ast/parser.go index fc05378b2..ca2505e19 100644 --- a/pkg/ast/parser.go +++ b/pkg/ast/parser.go @@ -13,9 +13,11 @@ import ( ) // Parse parses sys description into AST and returns top-level nodes. -func Parse(data []byte, filename string, errorHandler func(pos Pos, msg string)) (top []interface{}, ok bool) { +// If any errors are encountered, returns nil. +func Parse(data []byte, filename string, errorHandler ErrorHandler) *Description { p := &parser{s: newScanner(data, filename, errorHandler)} prevNewLine, prevComment := false, false + var top []Node for p.next(); p.tok != tokEOF; { decl := p.parseTopRecover() if decl == nil { @@ -39,37 +41,41 @@ func Parse(data []byte, filename string, errorHandler func(pos Pos, msg string)) if prevNewLine { top = top[:len(top)-1] } - ok = p.s.Ok() - return + if !p.s.Ok() { + return nil + } + return &Description{top} } -func ParseGlob(glob string, errorHandler func(pos Pos, msg string)) (top []interface{}, ok bool) { +func ParseGlob(glob string, errorHandler ErrorHandler) *Description { if errorHandler == nil { - errorHandler = loggingHandler + errorHandler = LoggingHandler } files, err := filepath.Glob(glob) if err != nil { errorHandler(Pos{}, fmt.Sprintf("failed to find input files: %v", err)) - return nil, false + return nil } if len(files) == 0 { errorHandler(Pos{}, fmt.Sprintf("no files matched by glob %q", glob)) - return nil, false + return nil } - ok = true + desc := &Description{} for _, f := range files { data, err := ioutil.ReadFile(f) if err != nil { errorHandler(Pos{}, fmt.Sprintf("failed to read input file: %v", err)) - return nil, false + return nil + } + desc1 := Parse(data, filepath.Base(f), errorHandler) + if desc1 == nil { + desc = nil } - top1, ok1 := Parse(data, filepath.Base(f), errorHandler) - if !ok1 { - ok = false + if desc != nil { + desc.Nodes = append(desc.Nodes, desc1.Nodes...) } - top = append(top, top1...) } - return + return desc } type parser struct { @@ -84,7 +90,7 @@ type parser struct { // Skip parsing till the next NEWLINE, for error recovery. var skipLine = errors.New("") -func (p *parser) parseTopRecover() interface{} { +func (p *parser) parseTopRecover() Node { defer func() { switch err := recover(); err { case nil: @@ -106,7 +112,7 @@ func (p *parser) parseTopRecover() interface{} { return decl } -func (p *parser) parseTop() interface{} { +func (p *parser) parseTop() Node { switch p.tok { case tokNewLine: return &NewLine{Pos: p.pos} @@ -266,7 +272,7 @@ func callName(s string) string { return s[:pos] } -func (p *parser) parseFlags(name *Ident) interface{} { +func (p *parser) parseFlags(name *Ident) Node { p.consume(tokEq) switch p.tok { case tokInt, tokIdent: @@ -379,6 +385,8 @@ func (p *parser) parseType() *Type { } p.next() if allowColon && p.tryConsume(tokColon) { + arg.HasColon = true + arg.Pos2 = p.pos switch p.tok { case tokInt: arg.Value2, arg.Value2Hex = p.parseIntValue() -- cgit mrf-deployment