aboutsummaryrefslogtreecommitdiff
path: root/driver/parser_test.go
blob: 17fee212363313c872bb15577afb11e9456d49dc (plain) (blame)
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package driver

import (
	"strings"
	"testing"

	"github.com/nihei9/vartan/grammar"
	"github.com/nihei9/vartan/spec"
)

func TestParser_Parse(t *testing.T) {
	tests := []struct {
		specSrc string
		src     string
	}{
		{
			specSrc: `
expr
    : expr "\+" term
    | term
    ;
term
    : term "\*" factor
    | factor
    ;
factor
    : "\(" expr "\)"
    | id
    ;
id: "[A-Za-z_][0-9A-Za-z_]*";
`,
			src: `(a+(b+c))*d+e`,
		},
		{
			specSrc: `
mode_tran_seq
    : mode_tran_seq mode_tran
    | mode_tran
    ;
mode_tran
    : push_m1
    | push_m2
    | pop_m1
    | pop_m2
    ;
push_m1: "->" # push m1;
@mode m1
push_m2: "-->" # push m2;
@mode m1
pop_m1 : "<-" # pop;
@mode m2
pop_m2: "<--" # pop;
`,
			src: `->--><--<-`,
		},
		{
			specSrc: `
s
    : foo bar
    ;
foo: "foo";
@mode default
bar: "bar";
`,
			src: `foobar`,
		},
	}
	for _, tt := range tests {
		ast, err := spec.Parse(strings.NewReader(tt.specSrc))
		if err != nil {
			t.Fatal(err)
		}
		g, err := grammar.NewGrammar(ast)
		if err != nil {
			t.Fatal(err)
		}
		gram, err := grammar.Compile(g)
		if err != nil {
			t.Fatal(err)
		}
		p, err := NewParser(gram, strings.NewReader(tt.src))
		if err != nil {
			t.Fatal(err)
		}
		err = p.Parse()
		if err != nil {
			t.Fatal(err)
		}

		printCST(p.GetCST(), 0)
	}
}