-
Notifications
You must be signed in to change notification settings - Fork 21
/
Copy pathparse_all.go
87 lines (59 loc) · 1.51 KB
/
parse_all.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package meta
import (
"errors"
"fmt"
"github.com/davyxu/golexer"
"io/ioutil"
)
func ParseFile(fileName string) (*FileDescriptorSet, error) {
fileset := NewFileDescriptorSet()
fileD := NewFileDescriptor()
fileD.FileName = fileName
err := rawPaseFile(fileD, fileName)
if err != nil {
return nil, err
}
fileset.addFile(fileD)
return fileset, fileset.resolveAll()
}
func ParseFileList(fileset *FileDescriptorSet, filelist []string) (string, error) {
for _, filename := range filelist {
fileD := NewFileDescriptor()
fileD.FileName = filename
fileset.addFile(fileD)
if err := rawPaseFile(fileD, filename); err != nil {
return filename, err
}
}
return "", fileset.resolveAll()
}
// 从文件解析
func rawPaseFile(fileD *FileDescriptor, fileName string) error {
data, err := ioutil.ReadFile(fileName)
if err != nil {
return err
}
return rawParse(fileD, string(data), fileName)
}
// 解析字符串
func rawParse(fileD *FileDescriptor, data string, srcName string) (retErr error) {
p := newSProtoParser(srcName)
defer golexer.ErrorCatcher(func(err error) {
retErr = fmt.Errorf("%s %s", p.PreTokenPos().String(), err.Error())
})
p.Lexer().Start(data)
p.NextToken()
for p.TokenID() != Token_EOF {
switch p.TokenID() {
case Token_Dot, Token_Message:
parseStruct(p, fileD, srcName)
case Token_Enum:
parseEnum(p, fileD, srcName)
case Token_FileTag:
parseFileTag(p, fileD, srcName)
default:
panic(errors.New("Unknown token: " + p.TokenValue()))
}
}
return nil
}