-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathparser.mly
More file actions
126 lines (99 loc) · 2.96 KB
/
Copy pathparser.mly
File metadata and controls
126 lines (99 loc) · 2.96 KB
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
%{ open Ast %}
%{ open List %}
%token <string> VAR
%token <int> INTE
%token NOTHING PAUSE PAR LOOP SIGNAL LPAR RPAR EMIT PRESENT TRAP EXIT SIMI
%token EOF ENTIL EMPTY DISJ COMMA CONCAT KLEENE END IN RUN OMEGA
%token THEN ELSE ABORT WHEN LBRACK RBRACK POWER
(* LBrackets RBrackets POWER*)
%left CONCAT DISJ PAR SIMI
(* %right SIMI PAR *)
%token FUTURE GLOBAL IMPLY LTLNOT NEXT UNTIL LILAND LILOR
%token LSPEC RSPEC ENSURE REQUIRE MODULE COLON INPUT OUTPUT
%start full_prog specProg pRog ee ltl_p
%type <(Ast.spec_prog) list> full_prog
%type <Ast.spec_prog> specProg
%type <Ast.prog> pRog
%type <(Ast.inclusion) list > ee
%type <(Ast.ltl) list > ltl_p
%%
full_prog:
| EOF {[]}
| a = specProg r = full_prog { append [a] r }
ee:
| EOF {[]}
| a = entailment SIMI r = ee { append [a] r }
ltl_p:
| EOF {[]}
| a = ltl SIMI r = ltl_p { append [a] r }
ltl :
| s = VAR {Lable s}
| LPAR r = ltl RPAR { r }
| NEXT p = ltl {Next p}
| LPAR p1= ltl UNTIL p2= ltl RPAR {Until (p1, p2)}
| GLOBAL p = ltl {Global p}
| FUTURE p = ltl {Future p}
| LTLNOT p = ltl {NotLTL p}
| LPAR p1= ltl IMPLY p2= ltl RPAR {Imply (p1, p2)}
| LPAR p1= ltl LILAND p2= ltl RPAR {AndLTL (p1, p2)}
| LPAR p1= ltl LILOR p2= ltl RPAR {OrLTL (p1, p2)}
singleVAR: var = VAR {[var]}
existVar:
| {[]}
| p = singleVAR {p}
| p1 = singleVAR COMMA p2 = existVar {append p1 p2 }
es:
| EMPTY { Emp }
| LBRACK signals = existVar RBRACK
{
let temp = List.map (fun a -> (One a)) signals in
Instance (temp) }
| LPAR r = es RPAR { r }
| a = es CONCAT b = es { Con(a, b) }
| a = es DISJ b=es {Disj (a, b)}
| LPAR a = es RPAR KLEENE {Kleene a}
| LPAR r = es RPAR n = INTE { Ntimed (r, n) }
| LPAR a = es RPAR POWER OMEGA {Omega a}
entailment:
| lhs = es ENTIL rhs = es { (lhs, rhs)}
pRog_aux:
| NOTHING { Nothing }
| PAUSE { Pause }
| EMIT s = VAR {Emit s}
| LOOP p = pRog END LOOP { Loop p}
| SIGNAL s = VAR IN p = pRog END SIGNAL { Declear (s, p)}
| PRESENT s = VAR THEN p1 = pRog ELSE p2 = pRog END PRESENT { Present (s, p1, p2)}
| TRAP mn = VAR IN p1 = pRog END TRAP {Trap (mn, p1)}
| EXIT mn = VAR {Exit mn}
(*| EXIT mn = VAR d = INTE {Exit (mn, d)}*)
| RUN mn = VAR {Run mn}
| ABORT p = pRog WHEN s = VAR {Suspend (p, s)}
pRog:
| p = pRog_aux {p}
| p1 = pRog SIMI p2 = pRog{ Seq (p1, p2)}
| LPAR p1 = pRog RPAR PAR LPAR p2 = pRog RPAR{ Par (p1, p2)}
(*
*)
specProg:
| MODULE nm = VAR COLON
INPUT ins = existVar SIMI
OUTPUT outs = existVar SIMI
LSPEC REQUIRE pre = es ENSURE post = es RSPEC p = pRog
END MODULE
{(nm, ins, outs, pre, post, p)}
| MODULE nm = VAR COLON
OUTPUT outs = existVar SIMI
LSPEC REQUIRE pre = es ENSURE post = es RSPEC p = pRog
END MODULE
{(nm, [], outs, pre, post, p)}
| MODULE nm = VAR COLON
INPUT ins = existVar SIMI
OUTPUT outs = existVar SIMI
p = pRog
END MODULE
{(nm, ins, outs, Instance [], Kleene (Instance []), p)}
| MODULE nm = VAR COLON
OUTPUT outs = existVar SIMI
p = pRog
END MODULE
{(nm, [], outs, Instance [], Kleene (Instance []), p)}