Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
182 commits
Select commit Hold shift + click to select a range
f3bf3a5
Add Laurel grammar and transformation
keyboardDrummer Dec 9, 2025
4589663
refactoring
keyboardDrummer Dec 9, 2025
037a7d1
Fixes
keyboardDrummer Dec 9, 2025
1c9cfd1
Moved tests
keyboardDrummer Dec 9, 2025
3a3809c
Fix grammar test
keyboardDrummer Dec 9, 2025
927b0bb
Getting there
keyboardDrummer Dec 9, 2025
faa49df
TestExamples test passes
keyboardDrummer Dec 9, 2025
4481959
Refactoring
keyboardDrummer Dec 9, 2025
c600cf1
Fix
keyboardDrummer Dec 9, 2025
25df923
Revert AdvancedMaps changes
keyboardDrummer Dec 10, 2025
3c933e5
Add missing license headers
keyboardDrummer Dec 10, 2025
f182891
Revert RealBitVector
keyboardDrummer Dec 10, 2025
5bc8abd
Tweaks
keyboardDrummer Dec 10, 2025
fe2a831
Save state
keyboardDrummer Dec 10, 2025
2cd178c
Refactoring
keyboardDrummer Dec 10, 2025
12946cf
Refactoring
keyboardDrummer Dec 10, 2025
b12d781
Cleanup
keyboardDrummer Dec 10, 2025
75cc85f
Merge branch 'main' into laurelParsing
keyboardDrummer Dec 10, 2025
84235b4
Fix Laurel/TestGrammar
keyboardDrummer Dec 10, 2025
cffb991
Merge branch 'laurelParsing' of github.com:keyboardDrummer/Strata int…
keyboardDrummer Dec 10, 2025
b2ae3dc
Move Boogie examples
keyboardDrummer Dec 11, 2025
ea3438f
Rename
keyboardDrummer Dec 11, 2025
77aa05a
Merge remote-tracking branch 'origin' into laurelParsing
keyboardDrummer Dec 15, 2025
fbe4de5
Move back Boogie examples
keyboardDrummer Dec 15, 2025
e827d76
Remove white line
keyboardDrummer Dec 15, 2025
ff76419
Moved examples
keyboardDrummer Dec 15, 2025
ce236d8
Delete Examples.lean files since they're obsolete
keyboardDrummer Dec 15, 2025
79fbeb9
Remove duplication
keyboardDrummer Dec 15, 2025
b0832e6
Expand test
keyboardDrummer Dec 15, 2025
2de306c
Do not use type and fn feature from DDM
keyboardDrummer Dec 15, 2025
6e90ace
Fix parser
keyboardDrummer Dec 15, 2025
8ff685d
Update translate file
keyboardDrummer Dec 15, 2025
086f6f8
Added some expected errors
keyboardDrummer Dec 15, 2025
0ea1bbb
Fix test
keyboardDrummer Dec 15, 2025
c397cb5
Attempt at translating to Boogie
keyboardDrummer Dec 15, 2025
126885b
Add sequencing of impure expressions
keyboardDrummer Dec 15, 2025
b547baf
Move towards combining test and source file
keyboardDrummer Dec 15, 2025
83c28d6
Improve translator to Boogie
keyboardDrummer Dec 16, 2025
a496a14
Merge remote-tracking branch 'origin/main' into laurelParsing
keyboardDrummer Dec 16, 2025
4ac44c9
Merge branch 'main' into moveExamples
keyboardDrummer Dec 16, 2025
c2164e2
Merge branch 'laurelParsing' into laurelMoreStmtExpr
keyboardDrummer Dec 16, 2025
245f7ad
Fix after merge
keyboardDrummer Dec 16, 2025
4683301
Merge branch 'laurelParsing' into laurelMoreStmtExpr
keyboardDrummer Dec 16, 2025
69e05e4
Update test
keyboardDrummer Dec 16, 2025
95bb904
Fix
keyboardDrummer Dec 16, 2025
1d19b86
Fix oops
keyboardDrummer Dec 16, 2025
0ebc51d
Merge branch 'laurelParsing' into laurelMoreStmtExpr
keyboardDrummer Dec 16, 2025
c44fad1
Fix warning
keyboardDrummer Dec 16, 2025
d0bada5
Fixes
keyboardDrummer Dec 16, 2025
125bf17
Fix warning
keyboardDrummer Dec 16, 2025
fd1374f
Renames
keyboardDrummer Dec 16, 2025
cd77f34
T2_NestedImpureStatements.lean
keyboardDrummer Dec 16, 2025
de4e4a4
Restructure files
keyboardDrummer Dec 16, 2025
110fc87
Improvements
keyboardDrummer Dec 16, 2025
0104e5a
Updates
keyboardDrummer Dec 16, 2025
a7562b5
Updates to the grammar
keyboardDrummer Dec 16, 2025
d530725
Updates
keyboardDrummer Dec 16, 2025
d37c57a
Add panics
keyboardDrummer Dec 16, 2025
871b27e
Translate all operators
keyboardDrummer Dec 16, 2025
8ddbaa3
Merge branch 'main' into moveExamples
aqjune-aws Dec 16, 2025
5624f00
Progress with T3
keyboardDrummer Dec 17, 2025
02c5cdd
Merge remote-tracking branch 'origin/main' into moveExamples
keyboardDrummer Dec 17, 2025
9efa44a
Undo bad changes
keyboardDrummer Dec 17, 2025
853aa4d
Merge branch 'laurelParsing' into laurelMoreStmtExpr
keyboardDrummer Dec 17, 2025
088816c
Merge branch 'moveExamples' into laurelMoreStmtExpr
keyboardDrummer Dec 17, 2025
f0454dd
T3 passes now
keyboardDrummer Dec 17, 2025
b70f84d
Added failing assertion
keyboardDrummer Dec 17, 2025
6b0c417
Add breaking comment
keyboardDrummer Dec 18, 2025
67f4b31
Test update
keyboardDrummer Dec 18, 2025
333fc61
Test passes now
keyboardDrummer Dec 18, 2025
eae1536
Merge branch 'main' into laurelParsing
keyboardDrummer Dec 18, 2025
7e16741
Merge remote-tracking branch 'origin/main' into laurelParsing
keyboardDrummer Dec 18, 2025
f711bdc
Merge branch 'laurelParsing' of github.com:keyboardDrummer/Strata int…
keyboardDrummer Dec 18, 2025
fbb9a07
Merge branch 'laurelParsing' into laurelMoreStmtExpr
keyboardDrummer Dec 18, 2025
0d964e3
Add missing file
keyboardDrummer Dec 18, 2025
b3c66a3
Fix
keyboardDrummer Dec 18, 2025
f75ed44
Improve testing output and fix some issues
keyboardDrummer Dec 18, 2025
c6c8d5c
Use dbg_trace instead of IO
keyboardDrummer Dec 18, 2025
f878398
Cleanup
keyboardDrummer Dec 18, 2025
f80e775
Rename
keyboardDrummer Dec 18, 2025
b7f4f86
Fix TestGrammar file
keyboardDrummer Dec 18, 2025
78b8c88
Refactoring
keyboardDrummer Dec 18, 2025
f24afe5
Cleanup
keyboardDrummer Dec 18, 2025
3283f93
Improvements to output parameters
keyboardDrummer Dec 18, 2025
b423c9e
Cleanup
keyboardDrummer Dec 18, 2025
4cec349
Rename file
keyboardDrummer Dec 19, 2025
c32a3d5
Move file
keyboardDrummer Dec 19, 2025
44c4082
Merge remote-tracking branch 'origin/main' into laurelParsing
keyboardDrummer Dec 19, 2025
d803b56
Fixes
keyboardDrummer Dec 19, 2025
613fec6
feat(DDM): Java code generator for dialects
fabiomadge Dec 23, 2025
e18f450
Merge remote-tracking branch 'origin/main' into feat/java-codegen
fabiomadge Dec 23, 2025
f99ea87
docs: update module docstring to mention builders
fabiomadge Dec 23, 2025
780c78e
test: verify deserialized AST structure
fabiomadge Dec 23, 2025
e0b2bb5
chore: remove redundant inline comments
fabiomadge Dec 23, 2025
da67291
refactor: use #load_dialect instead of inline dialect definition
fabiomadge Dec 23, 2025
67c170d
fix: correct test 2 title
fabiomadge Dec 23, 2025
8731075
test: use Simple dialect for compile test, include builders
fabiomadge Dec 23, 2025
98c3a4a
fix: disambiguate builders filename to avoid collisions
fabiomadge Dec 23, 2025
b36929a
refactor: use get! and alter for cleaner lookups
fabiomadge Dec 23, 2025
9856651
Fix TestGrammar
keyboardDrummer Dec 23, 2025
f6dfea9
Merge branch 'main' into laurelParsing
keyboardDrummer Dec 23, 2025
91ad85f
Merge branch 'laurelParsing' into laurelMoreStmtExpr
keyboardDrummer Dec 23, 2025
89d9008
Fixes
keyboardDrummer Dec 23, 2025
1404ab0
fix: escape builder method names for Java reserved words
fabiomadge Dec 23, 2025
f8a9a67
Merge branch 'main' into laurelParsing
shigoel Dec 24, 2025
e05f137
Add tests for what is not supported
keyboardDrummer Dec 24, 2025
1dde070
Code review from previous PR
keyboardDrummer Dec 24, 2025
721c6c0
Merge remote-tracking branch 'fork/laurelParsing' into laurelMoreStmt…
keyboardDrummer Dec 24, 2025
79203e4
Merge commit '23050398e4a9782' into laurelMoreStmtExpr
keyboardDrummer Dec 24, 2025
d0ea8bf
Small refactoring
keyboardDrummer Dec 24, 2025
a40faed
Merge branch 'laurelMoreStmtExpr' into laurelFundamentalsNotSupported
keyboardDrummer Dec 24, 2025
7cf21e0
Improve error reporting when calling solver
keyboardDrummer Dec 24, 2025
4f9e815
refactor: address PR #292 review comments
fabiomadge Dec 24, 2025
be0acbf
Merge remote-tracking branch 'origin/main' into feat/java-codegen
fabiomadge Dec 24, 2025
775600c
fix: support qualified names with dotted identifiers
fabiomadge Dec 24, 2025
22d07ed
Add LaurelGrammar.st file
keyboardDrummer Jan 2, 2026
bf0b2b9
Merge remote-tracking branch 'origin/main' into laurelMoreStmtExpr
keyboardDrummer Jan 5, 2026
53bab9c
Add missing import
keyboardDrummer Jan 5, 2026
cfc4a3a
Add laurelVerify command
keyboardDrummer Jan 5, 2026
b845049
Remove obsolete TestGrammar file
keyboardDrummer Jan 5, 2026
705cfb4
Fixes
keyboardDrummer Jan 5, 2026
28c581c
Fix namespace
keyboardDrummer Jan 5, 2026
b738175
Fix concrete tree converter
keyboardDrummer Jan 5, 2026
9e5a509
Add missing files to run regenerate-testdata.sh, and enable including…
keyboardDrummer Jan 6, 2026
52e1f3f
Added filepaths as well
keyboardDrummer Jan 6, 2026
e2f5f47
Consume list of StrataFiles when consuming Laurel over ion
keyboardDrummer Jan 7, 2026
ac9400b
Remove lineOffsets from StrataFile
keyboardDrummer Jan 7, 2026
8d10e11
Store source code byte offsets in the metadata instead of 2d positions
keyboardDrummer Jan 7, 2026
e2715f1
Fix printed filepath
keyboardDrummer Jan 7, 2026
9e7994d
Fixes
keyboardDrummer Jan 7, 2026
c3aec77
fix: address PR review comments
fabiomadge Jan 7, 2026
a3e9ec9
Merge branch 'main' into feat/java-codegen
fabiomadge Jan 7, 2026
46e0e58
Refactoring
keyboardDrummer Jan 8, 2026
44155c0
Refactoring
keyboardDrummer Jan 8, 2026
7400e34
Cleanup
keyboardDrummer Jan 8, 2026
f0068d6
Merge remote-tracking branch 'fabiomadge/feat/java-codegen' into forJ…
keyboardDrummer Jan 8, 2026
9c06af7
Cleanup
keyboardDrummer Jan 8, 2026
3948293
Cleanup
keyboardDrummer Jan 8, 2026
91058f8
Merge branch 'main' into laurelMoreStmtExpr
keyboardDrummer Jan 8, 2026
1c186a0
Fix errors
keyboardDrummer Jan 8, 2026
4bc6a2b
Remove hack
keyboardDrummer Jan 8, 2026
fbe3a2c
Fixes
keyboardDrummer Jan 8, 2026
e805c57
Merge branch 'laurelMoreStmtExpr' into laurelFundamentalsNotSupported
keyboardDrummer Jan 8, 2026
2a4fdf7
Fix issues
keyboardDrummer Jan 8, 2026
583f7ea
More fixes
keyboardDrummer Jan 8, 2026
c37e396
Fixes
keyboardDrummer Jan 8, 2026
122f63d
Improve error reporting
keyboardDrummer Jan 9, 2026
e8c8a13
Fixes to Strata/Languages/Laurel/LiftExpressionAssignments.lean
keyboardDrummer Jan 9, 2026
8ed03a4
Better error handling around solver process
keyboardDrummer Jan 9, 2026
7abbc3e
Attempt at getting better debug output
keyboardDrummer Jan 9, 2026
c711142
Refactoring
keyboardDrummer Jan 9, 2026
202633a
Refactoring
keyboardDrummer Jan 9, 2026
9451e45
Refactoring
keyboardDrummer Jan 9, 2026
2ff9f17
Refactoring
keyboardDrummer Jan 9, 2026
6197e3c
Turns things around
keyboardDrummer Jan 9, 2026
d4efe5b
Merge branch 'main' into laurelMoreStmtExpr
keyboardDrummer Jan 9, 2026
6a865f0
Fix
keyboardDrummer Jan 9, 2026
c90a7de
Add termination proofs for formatStmtExpr and translateExpr
Jan 9, 2026
98ca32b
Update docs Lean version to 4.26.0
keyboardDrummer Jan 12, 2026
14957b2
Merge remote-tracking branch 'origin/main' into forJVerify
keyboardDrummer Jan 12, 2026
a4d6089
Revert toolchain update
keyboardDrummer Jan 12, 2026
2104a31
Fixes
keyboardDrummer Jan 12, 2026
d19710f
Fixes
keyboardDrummer Jan 12, 2026
f0aa528
Sequence the program using a reversed list for bookkeeping
keyboardDrummer Jan 12, 2026
f282147
Merge branch 'main' into laurelMoreStmtExpr
keyboardDrummer Jan 12, 2026
a84748a
Remove noise
keyboardDrummer Jan 12, 2026
285ffc8
Bump documentation to 4.26.0
joehendrix Jan 12, 2026
5170e51
Merge branch 'laurelMoreStmtExpr' of github.com:keyboardDrummer/Strat…
keyboardDrummer Jan 12, 2026
212226d
Merge branch 'jhx/v4.26.0_docs' into forJVerify
keyboardDrummer Jan 12, 2026
5da0ff4
Merge remote-tracking branch 'origin/main' into forJVerify
keyboardDrummer Jan 13, 2026
e332bad
Fix merge mistakes
keyboardDrummer Jan 13, 2026
5d30ca5
Fixes
keyboardDrummer Jan 13, 2026
d15ab9a
Merge remote-tracking branch 'origin/main' into forJVerify
keyboardDrummer Jan 14, 2026
9d40949
Refactoring
keyboardDrummer Jan 14, 2026
6d7fc13
Merge remote-tracking branch 'origin/main' into forJVerify
keyboardDrummer Jan 14, 2026
a223c5d
Fix merge error
keyboardDrummer Jan 14, 2026
84d86e7
Fix errors
keyboardDrummer Jan 14, 2026
e283b22
Merge branch 'laurelMoreStmtExpr' into laurelFundamentalsNotSupported
keyboardDrummer Jan 14, 2026
fe86098
Merge commit 'da9169e0597~1' into laurelFundamentalsNotSupported
keyboardDrummer Jan 14, 2026
ed227ef
Merge commit 'da9169e0597' into laurelFundamentalsNotSupported
keyboardDrummer Jan 14, 2026
b694fae
Merge remote-tracking branch 'origin/main' into laurelFundamentalsNot…
keyboardDrummer Jan 14, 2026
c5f9687
Merge branch 'forJVerify' into laurelFundamentalsNotSupported
keyboardDrummer Jan 14, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 33 additions & 1 deletion Strata/DDM/AST.lean
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ module
public import Std.Data.HashMap.Basic
public import Strata.DDM.Util.ByteArray
public import Strata.DDM.Util.Decimal
public import Lean.Data.Position
public import Strata.DDM.AST.Datatype

import Std.Data.HashMap
Expand All @@ -17,6 +18,7 @@ set_option autoImplicit false

public section
namespace Strata
open Std (ToFormat Format format)

abbrev DialectName := String

Expand Down Expand Up @@ -234,16 +236,46 @@ structure SourceRange where
start : String.Pos.Raw
/-- One past the end of the range. -/
stop : String.Pos.Raw
deriving BEq, Inhabited, Repr
deriving DecidableEq, Inhabited, Repr

namespace SourceRange

def none : SourceRange := { start := 0, stop := 0 }

def isNone (loc : SourceRange) : Bool := loc.start = 0 ∧ loc.stop = 0

instance : ToFormat SourceRange where
format fr := f!"{fr.start}-{fr.stop}"

end SourceRange

inductive Uri where
| file (path: String)
deriving DecidableEq, Repr, Inhabited

instance : ToFormat Uri where
format fr := match fr with | .file path => path

structure FileRange where
file: Uri
range: Strata.SourceRange
deriving DecidableEq, Repr, Inhabited

instance : ToFormat FileRange where
format fr := f!"{fr.file}:{fr.range}"

structure File2dRange where
file: Uri
start: Lean.Position
ending: Lean.Position
deriving DecidableEq, Repr

instance : ToFormat File2dRange where
format fr :=
let baseName := match fr.file with
| .file path => (path.splitToList (· == '/')).getLast!
f!"{baseName}({fr.start.line}, {fr.start.column})-({fr.ending.line}, {fr.ending.column})"

abbrev Arg := ArgF SourceRange
abbrev Expr := ExprF SourceRange
abbrev Operation := OperationF SourceRange
Expand Down
68 changes: 64 additions & 4 deletions Strata/DDM/Ion.lean
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,7 @@ private protected def asList (v : Ion SymbolId) : FromIonM { a : Array (Ion Symb
match v with
| .mk (.list args) =>
return .mk args (by simp; omega)
| _ => throw s!"Expected list"
| x => throw s!"Expected list"

private protected def asSexp (name : String) (v : Ion SymbolId) : FromIonM ({ a : Array (Ion SymbolId) // a.size > 0 ∧ sizeOf a < sizeOf v}) :=
match v with
Expand Down Expand Up @@ -284,7 +284,7 @@ private def deserializeValue {α} (bs : ByteArray) (act : Ion SymbolId → FromI
throw s!"Error reading Ion: {msg} (offset = {off})"
| .ok a => pure a
let .isTrue p := inferInstanceAs (Decidable (a.size = 1))
| throw s!"Expected single Ion value."
| throw s!"Expected single Ion value, but got {repr a}."
let entries := a[0]
let .isTrue p := inferInstanceAs (Decidable (entries.size = 2))
| throw s!"Expected symbol table and value in dialect."
Expand Down Expand Up @@ -1405,6 +1405,11 @@ private instance : FromIon Dialect where

end Dialect

structure StrataFile where
filePath : String
program : Program
deriving Inhabited

namespace Program

private instance : CachedToIon Program where
Expand All @@ -1430,7 +1435,7 @@ def fromIonFragment (f : Ion.Fragment)
commands := ← fromIonFragmentCommands f
}

def fromIon (dialects : DialectMap) (dialect : DialectName) (bytes : ByteArray) : Except String Strata.Program := do
def fileFromIon (dialects : DialectMap) (dialect : DialectName) (bytes : ByteArray) : Except String Strata.Program := do
let (hdr, frag) ←
match Strata.Ion.Header.parse bytes with
| .error msg =>
Expand All @@ -1445,5 +1450,60 @@ def fromIon (dialects : DialectMap) (dialect : DialectName) (bytes : ByteArray)
throw s!"{name} program found when {dialect} expected."
fromIonFragment frag dialects dialect

def filesFromIon (dialects : DialectMap) (bytes : ByteArray) : Except String (List StrataFile) := do
let ctx ←
match Ion.deserialize bytes with
| .error (off, msg) => throw s!"Error reading Ion: {msg} (offset = {off})"
| .ok a =>
if p : a.size = 1 then
pure a[0]
else
throw s!"Expected single Ion value"

let .isTrue p := inferInstanceAs (Decidable (ctx.size = 2))
| throw "Expected symbol table and value"

let symbols ←
match SymbolTable.ofLocalSymbolTable ctx[0] with
| .error (p, msg) => throw s!"Error at {p}: {msg}"
| .ok symbols => pure symbols

let ionCtx : FromIonContext := ⟨symbols⟩

let ⟨filesList, _⟩ ← FromIonM.asList ctx[1]! ionCtx

let tbl := symbols
let filePathId := tbl.symbolId! "filePath"
let programId := tbl.symbolId! "program"

filesList.toList.mapM fun fileEntry => do
let fields ← FromIonM.asStruct0 fileEntry ionCtx

let some (_, filePathData) := fields.find? (·.fst == filePathId)
| throw "Could not find 'filePath' field"

let some (_, programData) := fields.find? (·.fst == programId)
| throw "Could not find 'program' field"

let filePath ← FromIonM.asString "filePath" filePathData ionCtx

let ⟨programValues, _⟩ ← FromIonM.asList programData ionCtx
let .isTrue ne := inferInstanceAs (Decidable (programValues.size ≥ 1))
| throw "Expected program header"

let hdr ← Ion.Header.fromIon programValues[0] ionCtx
let dialect ← match hdr with
| .program name => pure name
| .dialect _ => throw "Expected program, not dialect"

let frag : Ion.Fragment := {
symbols := symbols,
values := programValues,
offset := 1
}

let program ← fromIonFragment frag dialects dialect

pure { filePath := filePath, program := program }

end Strata.Program
end
37 changes: 16 additions & 21 deletions Strata/DL/Imperative/MetaData.lean
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

import Strata.DL.Imperative.PureExpr
import Strata.DL.Util.DecidableEq
import Strata.DDM.AST
import Lean.Data.Position

namespace Imperative
Expand Down Expand Up @@ -65,49 +66,36 @@ instance [Repr P.Ident] : Repr (MetaDataElem.Field P) where
| .label s => f!"MetaDataElem.Field.label {s}"
Repr.addAppParen res prec

inductive Uri where
| file (path: String)
deriving DecidableEq, Repr

instance : ToFormat Uri where
format fr := match fr with | .file path => path

structure FileRange where
file: Uri
start: Lean.Position
ending: Lean.Position
deriving DecidableEq, Repr

instance : ToFormat FileRange where
format fr := f!"{fr.file}:{fr.start}-{fr.ending}"

/-- A metadata value, which can be either an expression, a message, or a fileRange -/
inductive MetaDataElem.Value (P : PureExpr) where
/-- Metadata value in the form of a structured expression. -/
| expr (e : P.Expr)
/-- Metadata value in the form of an arbitrary string. -/
| msg (s : String)
/-- Metadata value in the form of a fileRange. -/
| fileRange (r: FileRange)

| fileRange (r: Strata.FileRange)
/-- Metadata value in the form of a fileRange. -/
| file2dRange (r: Strata.File2dRange)

instance [ToFormat P.Expr] : ToFormat (MetaDataElem.Value P) where
format f := match f with | .expr e => f!"{e}" | .msg s => f!"{s}" | .fileRange r => f!"{r}"
format f := match f with | .expr e => f!"{e}" | .msg s => f!"{s}" | .fileRange r => f!"{r}" | .file2dRange r => f!"{r}"

instance [Repr P.Expr] : Repr (MetaDataElem.Value P) where
reprPrec v prec :=
let res :=
match v with
| .expr e => f!"MetaDataElem.Value.expr {reprPrec e prec}"
| .msg s => f!"MetaDataElem.Value.msg {s}"
| .fileRange fr => f!"MetaDataElem.Value.fileRange {repr fr}"
| .fileRange fr => f!"MetaDataElem.Value.fileRange {fr}"
| .file2dRange fr => f!"MetaDataElem.Value.file2dRange {fr}"
Repr.addAppParen res prec

def MetaDataElem.Value.beq [BEq P.Expr] (v1 v2 : MetaDataElem.Value P) :=
match v1, v2 with
| .expr e1, .expr e2 => e1 == e2
| .msg m1, .msg m2 => m1 == m2
| .fileRange r1, .fileRange r2 => r1 == r2
| .file2dRange r1, .file2dRange r2 => r1 == r2
| _, _ => false

instance [BEq P.Expr] : BEq (MetaDataElem.Value P) where
Expand Down Expand Up @@ -183,11 +171,18 @@ instance [Repr P.Expr] [Repr P.Ident] : Repr (MetaDataElem P) where

def MetaData.fileRange : MetaDataElem.Field P := .label "fileRange"

def getFileRange {P : PureExpr} [BEq P.Ident] (md: MetaData P) : Option Strata.FileRange := do
let fileRangeElement <- md.findElem Imperative.MetaData.fileRange
match fileRangeElement.value with
| .fileRange fileRange =>
some fileRange
| _ => none

def MetaData.formatFileRange? {P} [BEq P.Ident] (md : MetaData P) (includeEnd? : Bool := false) :
Option Std.Format := do
let fileRangeElem ← md.findElem MetaData.fileRange
match fileRangeElem.value with
| .fileRange m =>
| .file2dRange m =>
let baseName := match m.file with
| .file path => (path.splitToList (· == '/')).getLast!
if includeEnd? then
Expand Down
19 changes: 10 additions & 9 deletions Strata/DL/Imperative/SMTUtils.lean
Original file line number Diff line number Diff line change
Expand Up @@ -115,31 +115,32 @@ def processModel {P : PureExpr} [ToFormat P.Ident]
| none => .error f!"Cannot find model for id: {id}"
| some p => .ok p.value

def runSolver (solver : String) (args : Array String) : IO String := do
def runSolver (solver : String) (args : Array String) : IO IO.Process.Output := do
let output ← IO.Process.output {
cmd := solver
args := args
}
-- dbg_trace f!"runSolver: exitcode: {repr output.exitCode}\n\
-- stderr: {repr output.stderr}\n\
-- stdout: {repr output.stdout}"
return output.stdout
return output

def solverResult {P : PureExpr} [ToFormat P.Ident]
(typedVarToSMTFn : P.Ident → P.Ty → Except Format (String × Strata.SMT.TermType))
(vars : List P.TypedIdent) (ans : String)
(vars : List P.TypedIdent) (output : IO.Process.Output)
(E : Strata.SMT.EncoderState) : Except Format (Result P.TypedIdent) := do
let pos := (ans.find (fun c => c == '\n' || c == '\r')).byteIdx
let verdict := ans.take pos
let rest := ans.drop pos
let stdout := output.stdout
let pos := (stdout.find (fun c => c == '\n' || c == '\r')).byteIdx
let verdict := stdout.take pos
let rest := stdout.drop pos
match verdict with
| "sat" =>
let rawModel ← getModel rest
let model ← processModel typedVarToSMTFn vars rawModel E
.ok (.sat model)
| "unsat" => .ok .unsat
| "unknown" => .ok .unknown
| other => .error other
| _ => .error s!"stderr:{output.stderr}\nsolver stdout: {output.stdout}\n"

def VC_folder_name: String := "vcs"

Expand Down Expand Up @@ -169,8 +170,8 @@ def dischargeObligation {P : PureExpr} [ToFormat P.Ident]
.ok "--produce-models"
else
return .error f!"Unsupported SMT solver: {smtsolver}"
let solver_out ← runSolver smtsolver #[filename, produce_models]
match solverResult typedVarToSMTFn vars solver_out estate with
let solver_output ← runSolver smtsolver #[filename, produce_models]
match solverResult typedVarToSMTFn vars solver_output estate with
| .error e => return .error e
| .ok result => return .ok (result, estate)

Expand Down
2 changes: 1 addition & 1 deletion Strata/Languages/Boogie/DDMTransform/Translate.lean
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ def SourceRange.toMetaData (ictx : InputContext) (sr : SourceRange) : Imperative
let startPos := ictx.fileMap.toPosition sr.start
let endPos := ictx.fileMap.toPosition sr.stop
let uri: Uri := .file file
let fileRangeElt := ⟨ MetaData.fileRange, .fileRange ⟨ uri, startPos, endPos ⟩ ⟩
let fileRangeElt := ⟨ MetaData.fileRange, .file2dRange ⟨ uri, startPos, endPos ⟩ ⟩
#[fileRangeElt]

def getOpMetaData (op : Operation) : TransM (Imperative.MetaData Boogie.Expression) :=
Expand Down
Loading
Loading