Skip to content

Commit 7369fe8

Browse files
committed
Fix a few bugs with lark parser for CBMC
1 parent 5f9c82e commit 7369fe8

File tree

3 files changed

+13
-21
lines changed

3 files changed

+13
-21
lines changed

sliver/backends/cbmc.py

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -97,26 +97,21 @@ class State:
9797
class CbmcCexTransformer(BaseTransformer):
9898
def state(self, n):
9999
header, lhs, rhs, *_ = n
100-
state_id, file, function, line, _ = header.children
100+
state_id, file, function, line, *_ = header.children
101101
return State(state_id, file, function, line, lhs, rhs)
102102

103103

104104
def translateCPROVER54(cex, info):
105105
with resources.path("sliver.grammars", "cbmc_cex.lark") as grammar_path:
106106
with open(grammar_path) as grammar:
107-
lark_parser = Lark(grammar,
108-
parser='lalr',
109-
start='start54',
110-
transformer=CbmcCexTransformer())
107+
lark_parser = Lark(grammar, parser='lalr', start='start54')
111108
yield from translateCPROVER(cex, info, parser=lark_parser)
112109

113110

114111
def translateCPROVERNEW(cex, info):
115112
with resources.path("sliver.grammars", "cbmc_cex.lark") as grammar_path:
116113
with open(grammar_path) as grammar:
117-
lark_parser = Lark(grammar,
118-
parser='lalr',
119-
transformer=CbmcCexTransformer())
114+
lark_parser = Lark(grammar, parser='lalr')
120115
yield from translateCPROVER(cex, info, parser=lark_parser)
121116

122117

@@ -147,7 +142,10 @@ def fmt(match, store_name, tid):
147142

148143
cex_start_pos = cex.find("Counterexample:") + 15
149144
cex_end_pos = cex.rfind("Violated property:")
150-
states = parser.parse(cex[cex_start_pos:cex_end_pos]).children
145+
tree = parser.parse(cex[cex_start_pos:cex_end_pos])
146+
transformer = CbmcCexTransformer()
147+
tree = transformer.transform(tree)
148+
states = tree.children
151149

152150
inits = [
153151
(s.lhs, s.rhs) for s in states

sliver/backends/common.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,14 +50,12 @@ def false(self, _):
5050
return False
5151

5252
def SIGNED_NUMBER(self, n):
53+
n = "".join(n)
5354
try:
5455
return int(n)
5556
except Exception:
5657
return float(n)
5758

58-
def NAME(self, n):
59-
return str(n)
60-
6159

6260
class Backend:
6361
"""Base class representing a generic analysis backend."""

sliver/grammars/cbmc_cex.lark

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,22 +14,18 @@ _SEP: "----------------------------------------------------"
1414

1515
?rhs : "TRUE" -> true
1616
| "FALSE" -> false
17-
| SIGNED_NUMBER ["u"]
17+
| SIGNED_NUMBER [ "ul" | "u" | "l" ]
1818
| "{" rhs ("," rhs)* "}"
1919

20-
integer : INT
20+
integer : INT
2121
_name : NAME
2222

23-
_rhs_bits : BITS
23+
_rhs_bits : BITS
2424
| "{" _rhs_bits ("," _rhs_bits)* "}"
2525

26-
header : \
27-
"State" integer "file" _name "function" _name \
28-
"line" integer "thread" integer
26+
header : "State" integer "file" _name "function" _name "line" integer "thread" integer
2927

30-
header_54 : \
31-
"State" integer "file" _name "line" integer \
32-
"function" _name "thread" integer
28+
header_54 : "State" integer "file" _name "line" integer "function" _name "thread" integer
3329

3430
_asgn : _name "=" rhs "(" _rhs_bits ")"
3531
state : header _SEP _asgn

0 commit comments

Comments
 (0)