Skip to content

Commit 14c2558

Browse files
committed
added typing rules for expressions.
1 parent 53e71f7 commit 14c2558

File tree

1 file changed

+101
-22
lines changed

1 file changed

+101
-22
lines changed

bil.ott

Lines changed: 101 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
indexvar index, i, j, k, l, m, n ::= {{ com subscripts}}
1+
indexvar index, m, n ::= {{ com subscripts}}
22
metavar id ::= {{ com a literal for variable}}
33
metavar num ::= {{ com number literal }}
44
metavar string,str ::= {{ com quoted string literal }}
@@ -22,29 +22,29 @@ grammar
2222
| ( exp ) :: S :: paren
2323
| var :: :: var
2424
| word :: :: int
25-
| e1 [ e2 , endian ] : size :: :: load
26-
| e1 with [ e2 , endian ] : size <- e3 :: :: store
25+
| e1 [ e2 , endian ] : nat :: :: load
26+
| e1 with [ e2 , endian ] : nat <- e3 :: :: store
2727
| e1 bop e2 :: :: binop
2828
| uop e1 :: :: unop
29-
| cast : size [ e ] :: :: cast
29+
| cast : nat [ e ] :: :: cast
3030
| let var = e1 in e2 :: :: let
3131
| unknown [ string ] : type :: :: unk
3232
| if e1 then e2 else e3 :: :: ite
33-
| extract : size1 : size2 [ e ] :: :: ext
33+
| extract : nat1 : nat2 [ e ] :: :: ext
3434
| e1 @ e2 :: :: concat
3535

3636
var :: var_ ::=
3737
| id : type :: S :: var
3838

3939
val,v :: val_ ::=
4040
| word :: M :: imm
41-
| v1 with [ v2 , endian ] : size <- v3 :: M :: mem
41+
| v1 with [ v2 , endian ] : nat <- v3 :: M :: mem
4242
| unknown [ string ] : type :: M :: bot
4343

4444
word,w :: word_ ::=
4545
| (w) :: S :: paren
46-
| num : size :: S :: word
47-
| 1 : size :: S :: one
46+
| num : nat :: S :: word
47+
| 1 : nat :: S :: one
4848
| true :: S :: true
4949
| false :: S :: false
5050
| w1 .+ w2 :: S :: plus
@@ -80,7 +80,7 @@ grammar
8080
| w1 .@ w2 :: S :: concat
8181
{{ tex [[w1]] \stackrel{bv} . [[w2]] }}
8282
| ext word ~hi : sz1 ~lo : sz2 :: S :: extend_extract
83-
| ext_s word ~hi : sz1 ~lo : sz2 :: S :: extend_extract_signed
83+
| exts word ~hi : sz1 ~lo : sz2 :: S :: extend_extract_signed
8484

8585

8686

@@ -113,13 +113,13 @@ grammar
113113
| - :: :: neg
114114
| ~ :: :: not
115115

116-
size,sz :: size_ ::=
116+
nat,sz :: nat_ ::=
117117
| 0 :: M :: zero
118118
| 1 :: M :: one
119119
| 8 :: M :: byte
120-
| size1 + size2 :: M :: size_plus
121-
| size1 - size2 :: M :: size_minus
122-
| ( size ) :: M :: size_paren
120+
| nat1 + nat2 :: M :: nat_plus
121+
| nat1 - nat2 :: M :: nat_minus
122+
| ( nat ) :: M :: nat_paren
123123

124124
endian,ed :: endian_ ::=
125125
| el :: :: little
@@ -132,19 +132,21 @@ grammar
132132
| unsigned :: :: unsinged
133133

134134
type,t :: type_ ::=
135-
| reg_ size :: :: imm
136-
| t1 ? t2 :: :: mem
135+
| imm < nat > :: :: imm
136+
| mem < nat1 , nat2 > :: :: mem
137137

138-
delta {{ tex \Delta}} :: '' ::=
138+
delta {{ tex \Delta}} :: delta_ ::=
139139
| [] :: :: nil
140140
| delta [ var <- val ] :: :: cons
141141

142-
143142
formula :: formula_ ::=
144143
| judgement :: :: judgement
145144
| ( formula ) :: M :: paren {{ coq ([[formula]]) }}
146145
| not formula :: M :: not {{ coq not [[formula]]}}
147146
| e1 <> e2 :: M :: exp_neq {{ coq ([[e1]] <> [[e2]]) }}
147+
| nat1 > nat2 :: M :: nat_gt {{ coq ([[nat1]] > [[nat2]])}}
148+
| nat1 = nat2 :: M :: nat_eq {{ coq ([[nat1]] = [[nat2]])}}
149+
| nat1 >= nat2 :: M :: nat_ge {{ coq ([[nat1]] >= [[nat2]])}}
148150

149151
terminals :: terminals_ ::=
150152
| -> :: :: rarrow {{ tex \rightarrow }}
@@ -215,16 +217,16 @@ defns reduce_exp :: '' ::=
215217
delta |- (v1 with [w,ed]:8 <- num:8)[w,ed]:8 ~> num:8
216218

217219
------------------------------------------------------------------------------ :: load_un_addr
218-
delta |- (v1 with [unknown[str]:t,ed]:8 <- v2)[v3,ed]:8 ~> unknown[str]:reg_8
220+
delta |- (v1 with [unknown[str]:t,ed]:8 <- v2)[v3,ed]:8 ~> unknown[str]:imm<8>
219221

220222

221223

222224
w1 <> w2
223225
---------------------------------------------------------- :: load_rec
224226
delta |- (v1 with [w1,ed]:8 <- v3)[w2,ed]:8 ~> v1[w2,ed]:8
225227

226-
----------------------------------------------- :: load_un_mem
227-
delta |- unknown[str]: t1?t2 ~> unknown[str]:t2
228+
---------------------------------------------------------- :: load_un_mem
229+
delta |- unknown[str]: mem<nat,sz> ~> unknown[str]:imm<sz>
228230

229231
succ w = w'
230232
--------------------------------------------------- :: load_word_be
@@ -420,7 +422,7 @@ defns reduce_exp :: '' ::=
420422

421423

422424
-------------------------------------------- :: cast_signed
423-
delta |- signed:sz[w] ~> ext_s w ~hi:(sz-1) ~lo:0
425+
delta |- signed:sz[w] ~> exts w ~hi:(sz-1) ~lo:0
424426

425427
-------------------------------------------- :: cast_unsigned
426428
delta |- unsigned:sz[w] ~> low:sz[w]
@@ -492,4 +494,81 @@ defns reduce_stmt :: '' ::=
492494

493495

494496
------------------------------------------------------------- :: seq_one
495-
delta,word |- {s1} ~> delta, word, {s1}
497+
delta,word |- {s1} ~> delta, word, {s1}
498+
499+
500+
defns typing_exp :: '' ::=
501+
defn exp '::' type :: :: type :: t_ by
502+
503+
504+
----------------- :: var
505+
id:t :: t
506+
507+
----------------- :: int
508+
num:sz :: imm<sz>
509+
510+
511+
----------------- :: true
512+
true :: imm<1>
513+
514+
515+
----------------- :: false
516+
false :: imm<1>
517+
518+
519+
e1 :: mem<nat,sz>
520+
e2 :: imm<nat>
521+
-------------------------- :: load
522+
e1 [e2, ed] : sz :: imm<sz>
523+
524+
525+
e1 :: mem<nat,sz>
526+
e2 :: imm<nat>
527+
e3 :: imm<sz>
528+
--------------------------------------------- :: store
529+
e1 with [e2, ed]:sz <- e3 :: mem<nat,sz>
530+
531+
532+
e1 :: imm<sz>
533+
e2 :: imm<sz>
534+
--------------------------------- :: bop
535+
e1 bop e2 :: imm<sz>
536+
537+
538+
e1 :: imm<sz>
539+
---------------------------------- :: uop
540+
uop e1 :: imm<sz>
541+
542+
543+
e :: imm<nat>
544+
--------------------- :: cast
545+
cast:sz[e] :: imm<sz>
546+
547+
548+
var :: t
549+
e1 :: t
550+
e2 :: t'
551+
------------------------ :: let
552+
let var = e1 in e2 :: t'
553+
554+
555+
------------------------- :: unknown
556+
unknown[str]:t :: t
557+
558+
559+
e1 :: imm<1>
560+
e2 :: t
561+
e3 :: t
562+
-------------------------- :: ite
563+
if e1 then e2 else e3 :: t
564+
565+
e :: imm<sz>
566+
sz1 >= sz2
567+
---------------------------------- :: extract
568+
extract:sz1:sz2[e] :: imm<sz1-sz2+1>
569+
570+
571+
e1 :: imm<sz1>
572+
e2 :: imm<sz2>
573+
---------------------------------- :: concat
574+
e1 @ e2 :: imm<sz1+sz2>

0 commit comments

Comments
 (0)