// Package participle constructs parsers from definitions in struct tags and parses directly into // those structs. The approach is philosophically similar to how other marshallers work in Go, // "unmarshalling" an instance of a grammar into a struct. // // The supported annotation syntax is: // // - `@` Capture expression into the field. // - `@@` Recursively capture using the fields own type. // - `` Match named lexer token. // - `( ... )` Group. // - `"..."` Match the literal (note that the lexer must emit tokens matching this literal exactly). // - `"...":` Match the literal, specifying the exact lexer token type to match. // - ` ...` Match expressions. // - ` | ` Match one of the alternatives. // // The following modifiers can be used after any expression: // // - `*` Expression can match zero or more times. // - `+` Expression must match one or more times. // - `?` Expression can match zero or once. // - `!` Require a non-empty match (this is useful with a sequence of optional matches eg. `("a"? "b"? "c"?)!`). // // Here's an example of an EBNF grammar. // // type Group struct { // Expression *Expression `"(" @@ ")"` // } // // type Option struct { // Expression *Expression `"[" @@ "]"` // } // // type Repetition struct { // Expression *Expression `"{" @@ "}"` // } // // type Literal struct { // Start string `@String` // lexer.Lexer token "String" // End string `("…" @String)?` // } // // type Term struct { // Name string ` @Ident` // Literal *Literal `| @@` // Group *Group `| @@` // Option *Option `| @@` // Repetition *Expression `| "(" @@ ")"` // } // // type Sequence struct { // Terms []*Term `@@+` // } // // type Expression struct { // Alternatives []*Sequence `@@ ("|" @@)*` // } // // type Expressions []*Expression // // type Production struct { // Name string `@Ident "="` // Expressions Expressions `@@+ "."` // } // // type EBNF struct { // Productions []*Production `@@*` // } package participle