parser.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467
  1. package pattern
  2. import (
  3. "fmt"
  4. "go/ast"
  5. "go/token"
  6. "reflect"
  7. )
  8. type Pattern struct {
  9. Root Node
  10. // Relevant contains instances of ast.Node that could potentially
  11. // initiate a successful match of the pattern.
  12. Relevant []reflect.Type
  13. }
  14. func MustParse(s string) Pattern {
  15. p := &Parser{AllowTypeInfo: true}
  16. pat, err := p.Parse(s)
  17. if err != nil {
  18. panic(err)
  19. }
  20. return pat
  21. }
  22. func roots(node Node) []reflect.Type {
  23. switch node := node.(type) {
  24. case Or:
  25. var out []reflect.Type
  26. for _, el := range node.Nodes {
  27. out = append(out, roots(el)...)
  28. }
  29. return out
  30. case Not:
  31. return roots(node.Node)
  32. case Binding:
  33. return roots(node.Node)
  34. case Nil, nil:
  35. // this branch is reached via bindings
  36. return allTypes
  37. default:
  38. Ts, ok := nodeToASTTypes[reflect.TypeOf(node)]
  39. if !ok {
  40. panic(fmt.Sprintf("internal error: unhandled type %T", node))
  41. }
  42. return Ts
  43. }
  44. }
  45. var allTypes = []reflect.Type{
  46. reflect.TypeOf((*ast.RangeStmt)(nil)),
  47. reflect.TypeOf((*ast.AssignStmt)(nil)),
  48. reflect.TypeOf((*ast.IndexExpr)(nil)),
  49. reflect.TypeOf((*ast.Ident)(nil)),
  50. reflect.TypeOf((*ast.ValueSpec)(nil)),
  51. reflect.TypeOf((*ast.GenDecl)(nil)),
  52. reflect.TypeOf((*ast.BinaryExpr)(nil)),
  53. reflect.TypeOf((*ast.ForStmt)(nil)),
  54. reflect.TypeOf((*ast.ArrayType)(nil)),
  55. reflect.TypeOf((*ast.DeferStmt)(nil)),
  56. reflect.TypeOf((*ast.MapType)(nil)),
  57. reflect.TypeOf((*ast.ReturnStmt)(nil)),
  58. reflect.TypeOf((*ast.SliceExpr)(nil)),
  59. reflect.TypeOf((*ast.StarExpr)(nil)),
  60. reflect.TypeOf((*ast.UnaryExpr)(nil)),
  61. reflect.TypeOf((*ast.SendStmt)(nil)),
  62. reflect.TypeOf((*ast.SelectStmt)(nil)),
  63. reflect.TypeOf((*ast.ImportSpec)(nil)),
  64. reflect.TypeOf((*ast.IfStmt)(nil)),
  65. reflect.TypeOf((*ast.GoStmt)(nil)),
  66. reflect.TypeOf((*ast.Field)(nil)),
  67. reflect.TypeOf((*ast.SelectorExpr)(nil)),
  68. reflect.TypeOf((*ast.StructType)(nil)),
  69. reflect.TypeOf((*ast.KeyValueExpr)(nil)),
  70. reflect.TypeOf((*ast.FuncType)(nil)),
  71. reflect.TypeOf((*ast.FuncLit)(nil)),
  72. reflect.TypeOf((*ast.FuncDecl)(nil)),
  73. reflect.TypeOf((*ast.ChanType)(nil)),
  74. reflect.TypeOf((*ast.CallExpr)(nil)),
  75. reflect.TypeOf((*ast.CaseClause)(nil)),
  76. reflect.TypeOf((*ast.CommClause)(nil)),
  77. reflect.TypeOf((*ast.CompositeLit)(nil)),
  78. reflect.TypeOf((*ast.EmptyStmt)(nil)),
  79. reflect.TypeOf((*ast.SwitchStmt)(nil)),
  80. reflect.TypeOf((*ast.TypeSwitchStmt)(nil)),
  81. reflect.TypeOf((*ast.TypeAssertExpr)(nil)),
  82. reflect.TypeOf((*ast.TypeSpec)(nil)),
  83. reflect.TypeOf((*ast.InterfaceType)(nil)),
  84. reflect.TypeOf((*ast.BranchStmt)(nil)),
  85. reflect.TypeOf((*ast.IncDecStmt)(nil)),
  86. reflect.TypeOf((*ast.BasicLit)(nil)),
  87. }
  88. var nodeToASTTypes = map[reflect.Type][]reflect.Type{
  89. reflect.TypeOf(String("")): nil,
  90. reflect.TypeOf(Token(0)): nil,
  91. reflect.TypeOf(List{}): {reflect.TypeOf((*ast.BlockStmt)(nil)), reflect.TypeOf((*ast.FieldList)(nil))},
  92. reflect.TypeOf(Builtin{}): {reflect.TypeOf((*ast.Ident)(nil))},
  93. reflect.TypeOf(Object{}): {reflect.TypeOf((*ast.Ident)(nil))},
  94. reflect.TypeOf(Function{}): {reflect.TypeOf((*ast.Ident)(nil)), reflect.TypeOf((*ast.SelectorExpr)(nil))},
  95. reflect.TypeOf(Any{}): allTypes,
  96. reflect.TypeOf(RangeStmt{}): {reflect.TypeOf((*ast.RangeStmt)(nil))},
  97. reflect.TypeOf(AssignStmt{}): {reflect.TypeOf((*ast.AssignStmt)(nil))},
  98. reflect.TypeOf(IndexExpr{}): {reflect.TypeOf((*ast.IndexExpr)(nil))},
  99. reflect.TypeOf(Ident{}): {reflect.TypeOf((*ast.Ident)(nil))},
  100. reflect.TypeOf(ValueSpec{}): {reflect.TypeOf((*ast.ValueSpec)(nil))},
  101. reflect.TypeOf(GenDecl{}): {reflect.TypeOf((*ast.GenDecl)(nil))},
  102. reflect.TypeOf(BinaryExpr{}): {reflect.TypeOf((*ast.BinaryExpr)(nil))},
  103. reflect.TypeOf(ForStmt{}): {reflect.TypeOf((*ast.ForStmt)(nil))},
  104. reflect.TypeOf(ArrayType{}): {reflect.TypeOf((*ast.ArrayType)(nil))},
  105. reflect.TypeOf(DeferStmt{}): {reflect.TypeOf((*ast.DeferStmt)(nil))},
  106. reflect.TypeOf(MapType{}): {reflect.TypeOf((*ast.MapType)(nil))},
  107. reflect.TypeOf(ReturnStmt{}): {reflect.TypeOf((*ast.ReturnStmt)(nil))},
  108. reflect.TypeOf(SliceExpr{}): {reflect.TypeOf((*ast.SliceExpr)(nil))},
  109. reflect.TypeOf(StarExpr{}): {reflect.TypeOf((*ast.StarExpr)(nil))},
  110. reflect.TypeOf(UnaryExpr{}): {reflect.TypeOf((*ast.UnaryExpr)(nil))},
  111. reflect.TypeOf(SendStmt{}): {reflect.TypeOf((*ast.SendStmt)(nil))},
  112. reflect.TypeOf(SelectStmt{}): {reflect.TypeOf((*ast.SelectStmt)(nil))},
  113. reflect.TypeOf(ImportSpec{}): {reflect.TypeOf((*ast.ImportSpec)(nil))},
  114. reflect.TypeOf(IfStmt{}): {reflect.TypeOf((*ast.IfStmt)(nil))},
  115. reflect.TypeOf(GoStmt{}): {reflect.TypeOf((*ast.GoStmt)(nil))},
  116. reflect.TypeOf(Field{}): {reflect.TypeOf((*ast.Field)(nil))},
  117. reflect.TypeOf(SelectorExpr{}): {reflect.TypeOf((*ast.SelectorExpr)(nil))},
  118. reflect.TypeOf(StructType{}): {reflect.TypeOf((*ast.StructType)(nil))},
  119. reflect.TypeOf(KeyValueExpr{}): {reflect.TypeOf((*ast.KeyValueExpr)(nil))},
  120. reflect.TypeOf(FuncType{}): {reflect.TypeOf((*ast.FuncType)(nil))},
  121. reflect.TypeOf(FuncLit{}): {reflect.TypeOf((*ast.FuncLit)(nil))},
  122. reflect.TypeOf(FuncDecl{}): {reflect.TypeOf((*ast.FuncDecl)(nil))},
  123. reflect.TypeOf(ChanType{}): {reflect.TypeOf((*ast.ChanType)(nil))},
  124. reflect.TypeOf(CallExpr{}): {reflect.TypeOf((*ast.CallExpr)(nil))},
  125. reflect.TypeOf(CaseClause{}): {reflect.TypeOf((*ast.CaseClause)(nil))},
  126. reflect.TypeOf(CommClause{}): {reflect.TypeOf((*ast.CommClause)(nil))},
  127. reflect.TypeOf(CompositeLit{}): {reflect.TypeOf((*ast.CompositeLit)(nil))},
  128. reflect.TypeOf(EmptyStmt{}): {reflect.TypeOf((*ast.EmptyStmt)(nil))},
  129. reflect.TypeOf(SwitchStmt{}): {reflect.TypeOf((*ast.SwitchStmt)(nil))},
  130. reflect.TypeOf(TypeSwitchStmt{}): {reflect.TypeOf((*ast.TypeSwitchStmt)(nil))},
  131. reflect.TypeOf(TypeAssertExpr{}): {reflect.TypeOf((*ast.TypeAssertExpr)(nil))},
  132. reflect.TypeOf(TypeSpec{}): {reflect.TypeOf((*ast.TypeSpec)(nil))},
  133. reflect.TypeOf(InterfaceType{}): {reflect.TypeOf((*ast.InterfaceType)(nil))},
  134. reflect.TypeOf(BranchStmt{}): {reflect.TypeOf((*ast.BranchStmt)(nil))},
  135. reflect.TypeOf(IncDecStmt{}): {reflect.TypeOf((*ast.IncDecStmt)(nil))},
  136. reflect.TypeOf(BasicLit{}): {reflect.TypeOf((*ast.BasicLit)(nil))},
  137. reflect.TypeOf(IntegerLiteral{}): {reflect.TypeOf((*ast.BasicLit)(nil)), reflect.TypeOf((*ast.UnaryExpr)(nil))},
  138. reflect.TypeOf(TrulyConstantExpression{}): allTypes, // this is an over-approximation, which is fine
  139. }
  140. var requiresTypeInfo = map[string]bool{
  141. "Function": true,
  142. "Builtin": true,
  143. "Object": true,
  144. }
  145. type Parser struct {
  146. // Allow nodes that rely on type information
  147. AllowTypeInfo bool
  148. lex *lexer
  149. cur item
  150. last *item
  151. items chan item
  152. }
  153. func (p *Parser) Parse(s string) (Pattern, error) {
  154. p.cur = item{}
  155. p.last = nil
  156. p.items = nil
  157. fset := token.NewFileSet()
  158. p.lex = &lexer{
  159. f: fset.AddFile("<input>", -1, len(s)),
  160. input: s,
  161. items: make(chan item),
  162. }
  163. go p.lex.run()
  164. p.items = p.lex.items
  165. root, err := p.node()
  166. if err != nil {
  167. // drain lexer if parsing failed
  168. for range p.lex.items {
  169. }
  170. return Pattern{}, err
  171. }
  172. if item := <-p.lex.items; item.typ != itemEOF {
  173. return Pattern{}, fmt.Errorf("unexpected token %s after end of pattern", item.typ)
  174. }
  175. return Pattern{
  176. Root: root,
  177. Relevant: roots(root),
  178. }, nil
  179. }
  180. func (p *Parser) next() item {
  181. if p.last != nil {
  182. n := *p.last
  183. p.last = nil
  184. return n
  185. }
  186. var ok bool
  187. p.cur, ok = <-p.items
  188. if !ok {
  189. p.cur = item{typ: eof}
  190. }
  191. return p.cur
  192. }
  193. func (p *Parser) rewind() {
  194. p.last = &p.cur
  195. }
  196. func (p *Parser) peek() item {
  197. n := p.next()
  198. p.rewind()
  199. return n
  200. }
  201. func (p *Parser) accept(typ itemType) (item, bool) {
  202. n := p.next()
  203. if n.typ == typ {
  204. return n, true
  205. }
  206. p.rewind()
  207. return item{}, false
  208. }
  209. func (p *Parser) unexpectedToken(valid string) error {
  210. if p.cur.typ == itemError {
  211. return fmt.Errorf("error lexing input: %s", p.cur.val)
  212. }
  213. var got string
  214. switch p.cur.typ {
  215. case itemTypeName, itemVariable, itemString:
  216. got = p.cur.val
  217. default:
  218. got = "'" + p.cur.typ.String() + "'"
  219. }
  220. pos := p.lex.f.Position(token.Pos(p.cur.pos))
  221. return fmt.Errorf("%s: expected %s, found %s", pos, valid, got)
  222. }
  223. func (p *Parser) node() (Node, error) {
  224. if _, ok := p.accept(itemLeftParen); !ok {
  225. return nil, p.unexpectedToken("'('")
  226. }
  227. typ, ok := p.accept(itemTypeName)
  228. if !ok {
  229. return nil, p.unexpectedToken("Node type")
  230. }
  231. var objs []Node
  232. for {
  233. if _, ok := p.accept(itemRightParen); ok {
  234. break
  235. } else {
  236. p.rewind()
  237. obj, err := p.object()
  238. if err != nil {
  239. return nil, err
  240. }
  241. objs = append(objs, obj)
  242. }
  243. }
  244. return p.populateNode(typ.val, objs)
  245. }
  246. func populateNode(typ string, objs []Node, allowTypeInfo bool) (Node, error) {
  247. T, ok := structNodes[typ]
  248. if !ok {
  249. return nil, fmt.Errorf("unknown node %s", typ)
  250. }
  251. if !allowTypeInfo && requiresTypeInfo[typ] {
  252. return nil, fmt.Errorf("Node %s requires type information", typ)
  253. }
  254. pv := reflect.New(T)
  255. v := pv.Elem()
  256. if v.NumField() == 1 {
  257. f := v.Field(0)
  258. if f.Type().Kind() == reflect.Slice {
  259. // Variadic node
  260. f.Set(reflect.AppendSlice(f, reflect.ValueOf(objs)))
  261. return v.Interface().(Node), nil
  262. }
  263. }
  264. if len(objs) != v.NumField() {
  265. return nil, fmt.Errorf("tried to initialize node %s with %d values, expected %d", typ, len(objs), v.NumField())
  266. }
  267. for i := 0; i < v.NumField(); i++ {
  268. f := v.Field(i)
  269. if f.Kind() == reflect.String {
  270. if obj, ok := objs[i].(String); ok {
  271. f.Set(reflect.ValueOf(string(obj)))
  272. } else {
  273. return nil, fmt.Errorf("first argument of (Binding name node) must be string, but got %s", objs[i])
  274. }
  275. } else {
  276. f.Set(reflect.ValueOf(objs[i]))
  277. }
  278. }
  279. return v.Interface().(Node), nil
  280. }
  281. func (p *Parser) populateNode(typ string, objs []Node) (Node, error) {
  282. return populateNode(typ, objs, p.AllowTypeInfo)
  283. }
  284. var structNodes = map[string]reflect.Type{
  285. "Any": reflect.TypeOf(Any{}),
  286. "Ellipsis": reflect.TypeOf(Ellipsis{}),
  287. "List": reflect.TypeOf(List{}),
  288. "Binding": reflect.TypeOf(Binding{}),
  289. "RangeStmt": reflect.TypeOf(RangeStmt{}),
  290. "AssignStmt": reflect.TypeOf(AssignStmt{}),
  291. "IndexExpr": reflect.TypeOf(IndexExpr{}),
  292. "Ident": reflect.TypeOf(Ident{}),
  293. "Builtin": reflect.TypeOf(Builtin{}),
  294. "ValueSpec": reflect.TypeOf(ValueSpec{}),
  295. "GenDecl": reflect.TypeOf(GenDecl{}),
  296. "BinaryExpr": reflect.TypeOf(BinaryExpr{}),
  297. "ForStmt": reflect.TypeOf(ForStmt{}),
  298. "ArrayType": reflect.TypeOf(ArrayType{}),
  299. "DeferStmt": reflect.TypeOf(DeferStmt{}),
  300. "MapType": reflect.TypeOf(MapType{}),
  301. "ReturnStmt": reflect.TypeOf(ReturnStmt{}),
  302. "SliceExpr": reflect.TypeOf(SliceExpr{}),
  303. "StarExpr": reflect.TypeOf(StarExpr{}),
  304. "UnaryExpr": reflect.TypeOf(UnaryExpr{}),
  305. "SendStmt": reflect.TypeOf(SendStmt{}),
  306. "SelectStmt": reflect.TypeOf(SelectStmt{}),
  307. "ImportSpec": reflect.TypeOf(ImportSpec{}),
  308. "IfStmt": reflect.TypeOf(IfStmt{}),
  309. "GoStmt": reflect.TypeOf(GoStmt{}),
  310. "Field": reflect.TypeOf(Field{}),
  311. "SelectorExpr": reflect.TypeOf(SelectorExpr{}),
  312. "StructType": reflect.TypeOf(StructType{}),
  313. "KeyValueExpr": reflect.TypeOf(KeyValueExpr{}),
  314. "FuncType": reflect.TypeOf(FuncType{}),
  315. "FuncLit": reflect.TypeOf(FuncLit{}),
  316. "FuncDecl": reflect.TypeOf(FuncDecl{}),
  317. "ChanType": reflect.TypeOf(ChanType{}),
  318. "CallExpr": reflect.TypeOf(CallExpr{}),
  319. "CaseClause": reflect.TypeOf(CaseClause{}),
  320. "CommClause": reflect.TypeOf(CommClause{}),
  321. "CompositeLit": reflect.TypeOf(CompositeLit{}),
  322. "EmptyStmt": reflect.TypeOf(EmptyStmt{}),
  323. "SwitchStmt": reflect.TypeOf(SwitchStmt{}),
  324. "TypeSwitchStmt": reflect.TypeOf(TypeSwitchStmt{}),
  325. "TypeAssertExpr": reflect.TypeOf(TypeAssertExpr{}),
  326. "TypeSpec": reflect.TypeOf(TypeSpec{}),
  327. "InterfaceType": reflect.TypeOf(InterfaceType{}),
  328. "BranchStmt": reflect.TypeOf(BranchStmt{}),
  329. "IncDecStmt": reflect.TypeOf(IncDecStmt{}),
  330. "BasicLit": reflect.TypeOf(BasicLit{}),
  331. "Object": reflect.TypeOf(Object{}),
  332. "Function": reflect.TypeOf(Function{}),
  333. "Or": reflect.TypeOf(Or{}),
  334. "Not": reflect.TypeOf(Not{}),
  335. "IntegerLiteral": reflect.TypeOf(IntegerLiteral{}),
  336. "TrulyConstantExpression": reflect.TypeOf(TrulyConstantExpression{}),
  337. }
  338. func (p *Parser) object() (Node, error) {
  339. n := p.next()
  340. switch n.typ {
  341. case itemLeftParen:
  342. p.rewind()
  343. node, err := p.node()
  344. if err != nil {
  345. return node, err
  346. }
  347. if p.peek().typ == itemColon {
  348. p.next()
  349. tail, err := p.object()
  350. if err != nil {
  351. return node, err
  352. }
  353. return List{Head: node, Tail: tail}, nil
  354. }
  355. return node, nil
  356. case itemLeftBracket:
  357. p.rewind()
  358. return p.array()
  359. case itemVariable:
  360. v := n
  361. if v.val == "nil" {
  362. return Nil{}, nil
  363. }
  364. var b Binding
  365. if _, ok := p.accept(itemAt); ok {
  366. o, err := p.node()
  367. if err != nil {
  368. return nil, err
  369. }
  370. b = Binding{
  371. Name: v.val,
  372. Node: o,
  373. }
  374. } else {
  375. p.rewind()
  376. b = Binding{Name: v.val}
  377. }
  378. if p.peek().typ == itemColon {
  379. p.next()
  380. tail, err := p.object()
  381. if err != nil {
  382. return b, err
  383. }
  384. return List{Head: b, Tail: tail}, nil
  385. }
  386. return b, nil
  387. case itemBlank:
  388. if p.peek().typ == itemColon {
  389. p.next()
  390. tail, err := p.object()
  391. if err != nil {
  392. return Any{}, err
  393. }
  394. return List{Head: Any{}, Tail: tail}, nil
  395. }
  396. return Any{}, nil
  397. case itemString:
  398. return String(n.val), nil
  399. default:
  400. return nil, p.unexpectedToken("object")
  401. }
  402. }
  403. func (p *Parser) array() (Node, error) {
  404. if _, ok := p.accept(itemLeftBracket); !ok {
  405. return nil, p.unexpectedToken("'['")
  406. }
  407. var objs []Node
  408. for {
  409. if _, ok := p.accept(itemRightBracket); ok {
  410. break
  411. } else {
  412. p.rewind()
  413. obj, err := p.object()
  414. if err != nil {
  415. return nil, err
  416. }
  417. objs = append(objs, obj)
  418. }
  419. }
  420. tail := List{}
  421. for i := len(objs) - 1; i >= 0; i-- {
  422. l := List{
  423. Head: objs[i],
  424. Tail: tail,
  425. }
  426. tail = l
  427. }
  428. return tail, nil
  429. }
  430. /*
  431. Node ::= itemLeftParen itemTypeName Object* itemRightParen
  432. Object ::= Node | Array | Binding | itemVariable | itemBlank | itemString
  433. Array := itemLeftBracket Object* itemRightBracket
  434. Array := Object itemColon Object
  435. Binding ::= itemVariable itemAt Node
  436. */