Example #1
0
// 分析 path 指向的文件,并将内容写入到 docs 中。
func parseFile(docs *doc.Doc, path string, blocks []*block, synerrLog *log.Logger) {
	data, err := ioutil.ReadFile(path)
	if err != nil && synerrLog != nil {
		synerrLog.Println(&app.SyntaxError{Message: err.Error(), File: path})
		return
	}

	l := &lexer{data: data}
	var block *block

	wg := sync.WaitGroup{}
	defer wg.Wait()

	for {
		if l.atEOF() {
			return
		}

		if block == nil {
			block = l.block(blocks)
			if block == nil { // 没有匹配的 block 了
				return
			}
		}

		ln := l.lineNumber() + 1 // 记录当前的行号,顺便调整为行号起始行号为 1
		rs, ok := block.end(l)
		if !ok && synerrLog != nil {
			synerrLog.Println(&app.SyntaxError{Line: ln, File: path, Message: "找不到结束标记"})
			return
		}

		if block.Type == blockTypeString {
			block = nil
			continue
		}
		block = nil

		wg.Add(1)
		go func(rs []rune, ln int) {
			if err := docs.Scan(rs); err != nil && synerrLog != nil {
				err.Line += ln
				err.File = path
				synerrLog.Println(err)
			}
			wg.Done()
		}(rs, ln)
	} // end for
}
Example #2
0
// 分析 path 指向的文件,并将内容写入到 docs 中。
func parseFile(docs *doc.Doc, path string, blocks []blocker, synerrLog *log.Logger) {
	data, err := ioutil.ReadFile(path)
	if err != nil && synerrLog != nil {
		synerrLog.Println(&app.SyntaxError{Message: err.Error(), File: path})
		return
	}

	l := &lexer{data: data}
	var block blocker

	wg := sync.WaitGroup{}
	defer wg.Wait()

	for {
		if l.atEOF() {
			return
		}

		if block == nil {
			block = l.block(blocks)
			if block == nil { // 没有匹配的 block 了
				return
			}
		}

		ln := l.lineNumber() + 1 // 记录当前的行号,顺便调整为行号起始行号为 1
		rs, ok := block.EndFunc(l)
		if !ok && synerrLog != nil {
			synerrLog.Println(&app.SyntaxError{Line: ln, File: path, Message: locale.Sprintf(locale.ErrNotFoundEndFlag)})
			return
		}

		block = nil
		if len(rs) < miniSize {
			continue
		}

		wg.Add(1)
		go func(rs []rune, ln int) {
			if err := docs.Scan(rs); err != nil && synerrLog != nil {
				err.Line += ln
				err.File = path
				synerrLog.Println(err)
			}
			wg.Done()
		}(rs, ln)
	} // end for
}