-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathparser.mly
55 lines (46 loc) · 1.4 KB
/
parser.mly
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
%token PRINT
%token <string> STRING
%token BROADCAST
%token <string> LOWER_ID
%token EQUAL
%token <char> CHAR
%token COMMA
%token <string> UPPER_ID
%token <int> INT
%token COLON
%token SEMICOLON
%token TO
%token ARROW
%token NL
%token EOF
%start <Grammar.top> top
%%
symbol:
| i = LOWER_ID { Grammar.SymbolMacro i }
| c = CHAR { Grammar.Symbol c }
| c = CHAR ; TO ; c2 = CHAR { Grammar.SymbolRange (c, c2) }
symbols:
| s = symbol { [s] }
| s = symbol ; COMMA ; l = symbols { s :: l }
action:
| m = UPPER_ID { Grammar.ActionMacro m }
| PRINT ; s = STRING { Grammar.Action (Action.Print s) }
| BROADCAST ; p = INT ; s = STRING { Grammar.Action (Action.Broadcast (p, s)) }
actions:
| a = action { [a] }
| a = action ; COMMA ; l = actions { a :: l }
state:
| i = LOWER_ID { Grammar.StateName i }
| n = INT { Grammar.StateIndex n }
transition:
| s = symbols ; ARROW ; d = state ; SEMICOLON ; a = actions ; NL { Grammar.SymbolUnion s, d, a }
transitions:
| t = transition { [t] }
| t = transition ; l = transitions { t :: l }
top:
| NL { Grammar.Empty (* FIXME? *) }
| i = LOWER_ID ; EQUAL ; s = symbols ; NL { Grammar.SymbolDefinition (i, Grammar.SymbolUnion s) }
| i = UPPER_ID ; EQUAL ; a = actions ; NL { Grammar.ActionDefinition (i, a) }
| s = state ; COLON ; t = transitions ; NL { Grammar.StateDefinition (s, t) }
| s = state ; COLON ; t = transitions ; EOF { Grammar.StateDefinition (s, t) }
| EOF { raise End_of_file }