69 lines
2.2 KiB
Go
69 lines
2.2 KiB
Go
|
// 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:
|
||
|
//
|
||
|
// - `@<expr>` Capture expression into the field.
|
||
|
// - `@@` Recursively capture using the fields own type.
|
||
|
// - `<identifier>` Match named lexer token.
|
||
|
// - `( ... )` Group.
|
||
|
// - `"..."` Match the literal (note that the lexer must emit tokens matching this literal exactly).
|
||
|
// - `"...":<identifier>` Match the literal, specifying the exact lexer token type to match.
|
||
|
// - `<expr> <expr> ...` Match expressions.
|
||
|
// - `<expr> | <expr>` 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
|