-
-
Notifications
You must be signed in to change notification settings - Fork 183
/
ebnf_test.go
39 lines (34 loc) · 1.1 KB
/
ebnf_test.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
package participle_test
import (
"strings"
"testing"
require "github.com/alecthomas/assert/v2"
)
func TestEBNF(t *testing.T) {
parser := mustTestParser(t, &EBNF{})
expected := `
EBNF = Production* .
Production = <ident> "=" Expression+ "." .
Expression = Sequence ("|" Sequence)* .
Sequence = Term+ .
Term = <ident> | Literal | Range | Group | LookaheadGroup | EBNFOption | Repetition | Negation .
Literal = <string> .
Range = <string> "…" <string> .
Group = "(" Expression ")" .
LookaheadGroup = "(" "?" ("=" | "!") Expression ")" .
EBNFOption = "[" Expression "]" .
Repetition = "{" Expression "}" .
Negation = "!" Expression .
`
require.Equal(t, strings.TrimSpace(expected), parser.String())
}
func TestEBNF_Other(t *testing.T) {
type Grammar struct {
PositiveLookahead string ` (?= 'good') @Ident`
NegativeLookahead string `| (?! 'bad' | "worse") @Ident`
Negation string `| !("anything" | 'but')`
}
parser := mustTestParser(t, &Grammar{})
expected := `Grammar = ((?= "good") <ident>) | ((?! "bad" | "worse") <ident>) | ~("anything" | "but") .`
require.Equal(t, expected, parser.String())
}