Skip to content

Instantly share code, notes, and snippets.

@tpott
Created May 26, 2014 16:48
Show Gist options
  • Save tpott/c2ed972a6437da66465e to your computer and use it in GitHub Desktop.
Save tpott/c2ed972a6437da66465e to your computer and use it in GitHub Desktop.
simple go parser
// self_parsing.go
// Mon May 26 09:47:10 PDT 2014
package main
import (
"os"
"fmt"
"reflect"
"go/ast"
"go/parser"
"go/token"
)
type MyVisitor struct {
}
func (v *MyVisitor) Visit(n ast.Node) (w ast.Visitor) {
if n != nil {
fmt.Println(reflect.TypeOf(n), n.Pos(), n.End())
}
return v
}
func main() {
var filename = os.Args[1]
fmt.Println("filename=", filename)
tree, err := parser.ParseFile(token.NewFileSet(), filename, nil, 0)
if err != nil {
fmt.Println("err! ", err)
os.Exit(1)
}
ast.Walk(new(MyVisitor), tree)
}
@tpott
Copy link
Author

tpott commented May 26, 2014

# go build self_parsing.go
# ./self_parsing self_parsing.go
filename= self_parsing.go
*ast.File 21 535
*ast.Ident 29 33
*ast.GenDecl 35 110
*ast.ImportSpec 46 50
*ast.BasicLit 46 50
*ast.ImportSpec 53 58
*ast.BasicLit 53 58
*ast.ImportSpec 61 70
*ast.BasicLit 61 70
*ast.ImportSpec 73 81
*ast.BasicLit 73 81
*ast.ImportSpec 84 95
*ast.BasicLit 84 95
*ast.ImportSpec 98 108
*ast.BasicLit 98 108
*ast.GenDecl 112 137
*ast.TypeSpec 117 137
*ast.Ident 117 126
*ast.StructType 127 137
*ast.FieldList 134 137
*ast.FuncDecl 139 281
*ast.FieldList 144 158
*ast.Field 145 157
*ast.Ident 145 146
*ast.StarExpr 147 157
*ast.Ident 148 157
*ast.Ident 159 164
*ast.FuncType 139 192
*ast.FieldList 164 176
*ast.Field 165 175
*ast.Ident 165 166
*ast.SelectorExpr 167 175
*ast.Ident 167 170
*ast.Ident 171 175
*ast.FieldList 177 192
*ast.Field 178 191
*ast.Ident 178 179
*ast.SelectorExpr 180 191
*ast.Ident 180 183
*ast.Ident 184 191
*ast.BlockStmt 193 281
*ast.IfStmt 197 267
*ast.BinaryExpr 200 208
*ast.Ident 200 201
*ast.Ident 205 208
*ast.BlockStmt 209 267
*ast.ExprStmt 215 263
*ast.CallExpr 215 263
*ast.SelectorExpr 215 226
*ast.Ident 215 218
*ast.Ident 219 226
*ast.CallExpr 227 244
*ast.SelectorExpr 227 241
*ast.Ident 227 234
*ast.Ident 235 241
*ast.Ident 242 243
*ast.CallExpr 246 253
*ast.SelectorExpr 246 251
*ast.Ident 246 247
*ast.Ident 248 251
*ast.CallExpr 255 262
*ast.SelectorExpr 255 260
*ast.Ident 255 256
*ast.Ident 257 260
*ast.ReturnStmt 271 279
*ast.Ident 278 279
*ast.FuncDecl 283 535
*ast.Ident 288 292
*ast.FuncType 283 294
*ast.FieldList 292 294
*ast.BlockStmt 295 535
*ast.DeclStmt 299 324
*ast.GenDecl 299 324
*ast.ValueSpec 303 324
*ast.Ident 303 311
*ast.IndexExpr 314 324
*ast.SelectorExpr 314 321
*ast.Ident 314 316
*ast.Ident 317 321
*ast.BasicLit 322 323
*ast.ExprStmt 327 361
*ast.CallExpr 327 361
*ast.SelectorExpr 327 338
*ast.Ident 327 330
*ast.Ident 331 338
*ast.BasicLit 339 350
*ast.Ident 352 360
*ast.AssignStmt 365 432
*ast.Ident 365 369
*ast.Ident 371 374
*ast.CallExpr 378 432
*ast.SelectorExpr 378 394
*ast.Ident 378 384
*ast.Ident 385 394
*ast.CallExpr 395 413
*ast.SelectorExpr 395 411
*ast.Ident 395 400
*ast.Ident 401 411
*ast.Ident 415 423
*ast.Ident 425 428
*ast.BasicLit 430 431
*ast.IfStmt 435 499
*ast.BinaryExpr 438 448
*ast.Ident 438 441
*ast.Ident 445 448
*ast.BlockStmt 449 499
*ast.ExprStmt 455 480
*ast.CallExpr 455 480
*ast.SelectorExpr 455 466
*ast.Ident 455 458
*ast.Ident 459 466
*ast.BasicLit 467 474
*ast.Ident 476 479
*ast.ExprStmt 485 495
*ast.CallExpr 485 495
*ast.SelectorExpr 485 492
*ast.Ident 485 487
*ast.Ident 488 492
*ast.BasicLit 493 494
*ast.ExprStmt 503 533
*ast.CallExpr 503 533
*ast.SelectorExpr 503 511
*ast.Ident 503 506
*ast.Ident 507 511
*ast.CallExpr 512 526
*ast.Ident 512 515
*ast.Ident 516 525
*ast.Ident 528 532

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment