Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
328 commits
Select commit Hold shift + click to select a range
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
3d358ca
Cleanup
keyboardDrummer Jan 14, 2026
086bf22
Draft work
keyboardDrummer Jan 14, 2026
8da23f6
Cleanup
keyboardDrummer Jan 15, 2026
2797281
Merge remote-tracking branch 'origin/main' into forJVerify
keyboardDrummer Jan 15, 2026
49bac76
Fix failing proof by adding ': h'
keyboardDrummer Jan 15, 2026
4b86292
Fix merge mistakes
keyboardDrummer Jan 15, 2026
e6142e3
Merge branch 'forJVerify' into mutableFields
keyboardDrummer Jan 15, 2026
61b305e
Some updates
keyboardDrummer Jan 15, 2026
0a777e0
Updates
keyboardDrummer Jan 15, 2026
4ab53da
Fix translator
keyboardDrummer Jan 15, 2026
25c36f5
Start
keyboardDrummer Jan 15, 2026
6c964ad
Progress
keyboardDrummer Jan 15, 2026
d539bec
Some changes
keyboardDrummer Jan 15, 2026
e4df61f
Updates
keyboardDrummer Jan 15, 2026
dd16f98
Updates
keyboardDrummer Jan 15, 2026
bafb7d2
Remove repr usage
keyboardDrummer Jan 16, 2026
79ee155
Merge remote-tracking branch 'origin/main' into forJVerify
keyboardDrummer Jan 16, 2026
8e20c05
Fix build error
keyboardDrummer Jan 16, 2026
a5b1e4b
Additional fix
keyboardDrummer Jan 16, 2026
39d7d71
Fix
keyboardDrummer Jan 16, 2026
b6cd5c1
T1_MutableFields passes, although it's partially commented out
keyboardDrummer Jan 16, 2026
f4b1ab9
Merge remote-tracking branch 'origin/main' into mutableFields
keyboardDrummer Jan 16, 2026
ff3bb23
Merge remote-tracking branch 'fork/forJVerify' into mutableFields
keyboardDrummer Jan 16, 2026
da8413c
Merge branch 'main' into forJVerify
keyboardDrummer Jan 16, 2026
3a16928
Merge remote-tracking branch 'fork/forJVerify' into mutableFields
keyboardDrummer Jan 16, 2026
d72523c
Add limited procedure calls test
keyboardDrummer Jan 16, 2026
2812fc0
Improved test
keyboardDrummer Jan 16, 2026
89aa89a
T5_ProcedureCallsBoogie.lean passes now
keyboardDrummer Jan 16, 2026
a9d5c60
Add comment
keyboardDrummer Jan 16, 2026
9022bf6
Merge remote-tracking branch 'origin/main' into forJVerify
keyboardDrummer Jan 17, 2026
c5dad5c
Remove obsolete comment
keyboardDrummer Jan 19, 2026
e76bd6d
Merge remote-tracking branch 'fork/forJVerify' into mutableFields
keyboardDrummer Jan 19, 2026
03a9c58
Use removeIrrelevantAxioms
keyboardDrummer Jan 19, 2026
221ca78
Fixes
keyboardDrummer Jan 19, 2026
3d7fde2
Fix T1_MutableFields
keyboardDrummer Jan 19, 2026
363ef03
Phase 1: Add missing operators to Laurel grammar
fabiomadge Jan 20, 2026
9c24041
Phase 2: Add while loops with invariants
fabiomadge Jan 20, 2026
1f84638
Phase 3: Extend pre/postconditions from single to list
fabiomadge Jan 20, 2026
babc4d5
Phase 3b: Add constrained types with boundary checks
fabiomadge Jan 20, 2026
53c4e80
Phase 3b: Add constraint checks for local variables
fabiomadge Jan 20, 2026
eba55e9
Phase 3b: Add constraint checks for reassignments
fabiomadge Jan 20, 2026
255e547
Phase 3b: Fix Assign with StaticCall to generate call statement
fabiomadge Jan 20, 2026
8c2f6c7
Refactor: Extract helper functions to reduce duplication
fabiomadge Jan 20, 2026
adca6b8
Phase 4: Add quantifiers (forall/exists)
fabiomadge Jan 20, 2026
3c65a1f
Phase 4: Add constraint checks for quantifier bound variables
fabiomadge Jan 20, 2026
3481661
Phase 4: Make translateExpr non-partial with pre-translated constraints
fabiomadge Jan 20, 2026
87cae72
Improve error messages for unsupported constraint expressions
fabiomadge Jan 20, 2026
4ceec58
Refactor: Extract translateBinOp and translateUnaryOp helpers
fabiomadge Jan 20, 2026
e150b27
Phase 5: Arrays - Array type, indexing, length, parameter expansion
fabiomadge Jan 20, 2026
815252f
Phase 6: Sequence operations - Seq.Contains, Seq.Take, Seq.Drop
fabiomadge Jan 20, 2026
83f4601
Refactor: extract isExpressionCall helper to reduce duplication
fabiomadge Jan 20, 2026
ea55c82
Fix isPureExpr for quantifiers and Map type SMT encoding
fabiomadge Jan 20, 2026
6e24372
Add function type annotations to static calls in Laurel to Core trans…
fabiomadge Jan 20, 2026
62afe4d
Improve Laurel grammar formatting and translator error handling
fabiomadge Jan 23, 2026
65c5cc0
Stop silently ignoring internal errors
keyboardDrummer Jan 23, 2026
5abd846
Prevent leaving out metadata from check.
keyboardDrummer Jan 23, 2026
060b694
Move more source locations through the Laurel compilation pipeline
keyboardDrummer Jan 23, 2026
f4dd2ac
More usages of md
keyboardDrummer Jan 23, 2026
fd36fb6
Generate SourceRange overloads for Java factory methods
fabiomadge Jan 23, 2026
f7e24e8
Merge origin/main into jverify-strata-backend
fabiomadge Feb 2, 2026
845fad0
Improve grammar formatting with proper spacing
fabiomadge Feb 2, 2026
e285bab
Fix C_Simp while loop formatting (decreases/invariant spacing)
fabiomadge Feb 2, 2026
4ed8870
Fix C_Simp formatting: proper indentation and NewlineSepBy for blocks
fabiomadge Feb 2, 2026
abf11f9
Fix formatting and Laurel translator bugs
fabiomadge Feb 2, 2026
bb06625
Merge origin/main
fabiomadge Feb 2, 2026
6418a27
Add constrained array element type support in Laurel translator
fabiomadge Feb 3, 2026
bbb18c5
Reorganize Laurel tests, fix insideCondition bug, revert unused Laure…
fabiomadge Feb 4, 2026
73e22b0
Merge origin/main
fabiomadge Feb 4, 2026
f3a902b
Remove accidentally committed file
fabiomadge Feb 4, 2026
526a654
Add missing copyright headers
fabiomadge Feb 4, 2026
533dbe6
Fix array argument expansion in procedure calls
fabiomadge Feb 5, 2026
9512afb
Remove trailing whitespace
fabiomadge Feb 5, 2026
199be91
Merge origin/main
fabiomadge Feb 5, 2026
9e61e38
Improve comment wording
fabiomadge Feb 5, 2026
191ffc4
Improve syntax error message
fabiomadge Feb 5, 2026
f5671ea
Simplify newline separator formatting
fabiomadge Feb 5, 2026
8122075
Fix comment parsing when / is a token
fabiomadge Feb 6, 2026
6793173
Heap parameterization with explicit in/out parameters and multi-targe…
fabiomadge Feb 10, 2026
7517b51
Merge remote-tracking branch 'origin/main' into jverify-strata-backend
fabiomadge Feb 10, 2026
0912973
Fix minor issues found during PR review
fabiomadge Feb 10, 2026
cce0f77
Use Map.ofEntries instead of Map.of for separator maps to avoid 10-en…
fabiomadge Feb 10, 2026
89891a3
Add cutoff to liftBVars for correct shifting under binders; revert un…
fabiomadge Feb 10, 2026
77e8a5c
Remove stale Determinism comment, add trailing newline to grammar, re…
fabiomadge Feb 10, 2026
56f7cca
Make LaurelFormat functions total, revert field access separator to #
fabiomadge Feb 10, 2026
2abee36
Simplify termination proofs in LiftExpressionAssignments
fabiomadge Feb 10, 2026
e2d5da5
Fix <- to ← for consistency
fabiomadge Feb 10, 2026
2dd1519
fix formatting
fabiomadge Feb 10, 2026
f13f1d8
fix formatting
fabiomadge Feb 10, 2026
03d5e48
fix formatting
fabiomadge Feb 10, 2026
be726a0
Make heapTransformExpr total, simplify termination proofs
fabiomadge Feb 10, 2026
0778d16
fix formatting
fabiomadge Feb 10, 2026
da3e099
LaurelToCoreTranslator: cleanup dead code, fix isPureExpr, remove dup…
fabiomadge Feb 10, 2026
9343a1a
Improve grammar formatting: spaces around :: in Core quantifiers, ind…
fabiomadge Feb 10, 2026
f3967fc
Remove commented out #end in C_Simp grammar
fabiomadge Feb 10, 2026
0025b01
LaurelToCoreTranslator: prove termination for translateType
fabiomadge Feb 10, 2026
81017bf
LaurelToCoreTranslator: prove termination for 7 more functions
fabiomadge Feb 10, 2026
3c60c2c
LaurelToCoreTranslator: extract stmtexpr_wf tactic macro for terminat…
fabiomadge Feb 10, 2026
68c6c74
LaurelToCoreTranslator: shorten HighTypeMd.sizeOf_val_lt proof
fabiomadge Feb 10, 2026
97a7013
LaurelToCoreTranslator: simplify stmtexpr_wf using cases+subst+simp_wf
fabiomadge Feb 10, 2026
2b6e754
HeapParameterization: simplify collectExprMd termination proof
fabiomadge Feb 10, 2026
912d9cc
Add java.lang classes to reserved words to avoid name collisions
fabiomadge Feb 10, 2026
7a8a234
Merge branch 'main' into jverify-strata-backend
andrewmwells-amazon Feb 11, 2026
7124ee7
Merge origin/main: adopt WithMetadata generic, keep branch features
fabiomadge Feb 11, 2026
783dd1b
Merge origin/main: adopt term_by_mem tactic for termination proofs
fabiomadge Feb 12, 2026
313de3a
Merge origin/main: cvc5 default solver, app builtin, Python specs mod…
fabiomadge Feb 12, 2026
fb9c7f6
Fix arrayElemAssumes hoisting bug, add TODO for array-specific constr…
fabiomadge Feb 12, 2026
fd3dc37
Merge origin/main: mutually recursive types in Core concrete syntax
fabiomadge Feb 12, 2026
affc789
Merge branch 'main' into jverify-strata-backend
andrewmwells-amazon Feb 12, 2026
f530354
Fix MutualDatatypes test: update expected output for new formatting
fabiomadge Feb 12, 2026
88d1a43
Address review feedback: simplify parser, Java codegen, and formatting
fabiomadge Feb 13, 2026
9e235df
Merge remote-tracking branch 'origin/main' into jverify-strata-backend
keyboardDrummer Feb 13, 2026
ec98083
Merge branch 'main' into jverify-strata-backend
keyboardDrummer Feb 13, 2026
11e3ad1
Merge remote-tracking branch 'origin/main' into jverify-strata-backend
keyboardDrummer Feb 16, 2026
69b57c0
Remove obsolete stuff
keyboardDrummer Feb 16, 2026
3dd3889
Fix merge mistake
keyboardDrummer Feb 16, 2026
738c051
Cleanup
keyboardDrummer Feb 16, 2026
6067f88
Merge branch 'main' into jverify-strata-backend
andrewmwells-amazon Feb 16, 2026
3eea06d
Merge commit '68e47a1d6a8~1' into jverify-strata-backend
keyboardDrummer Feb 19, 2026
e659c7b
Merge commit '68e47a1d6a8' into jverify-strata-backend
keyboardDrummer Feb 19, 2026
ede0ffe
Fix test failures and StrataMain build errors
fabiomadge Feb 24, 2026
dad22b5
Merge main up to 73c80cee (pre-PR#417) into jverify-strata-backend
fabiomadge Feb 24, 2026
8d30b98
Restore DivT/ModT to Factory, use empty precondition lists
fabiomadge Feb 24, 2026
a2e3ca0
Merge PR #417 (Enable creating new objects) into jverify-strata-backend
fabiomadge Feb 24, 2026
ea9c74c
Merge remaining 9 commits from origin/main into jverify-strata-backend
fabiomadge Feb 24, 2026
82a55c1
Remove unused termination hints from transformExprDiscarded
fabiomadge Feb 24, 2026
90b91fb
Suppress unused variable warning for funcNames in translateProcedure
fabiomadge Feb 24, 2026
97aa522
Restore Determinism type and determinism field to Laurel Procedure
fabiomadge Feb 25, 2026
df88fff
Merge branch 'main' into jverify-strata-backend
fabiomadge Feb 25, 2026
470d98c
Restore formatDeterminism and ToFormat instance for Determinism
fabiomadge Feb 25, 2026
a0fa7a3
Add tests for quantifier constraint injection and array edge cases
fabiomadge Feb 25, 2026
73d5092
Rename test files to T19/T20 to follow sequential numbering
fabiomadge Feb 25, 2026
0748703
Renumber Laurel test files: slot QuantifierConstraints after T09, Arr…
fabiomadge Feb 25, 2026
142009b
Merge main into jverify-strata-backend
fabiomadge Mar 2, 2026
294d19c
Wire quantifier constraint injection and constrained type parameter r…
fabiomadge Mar 2, 2026
fbd3cc1
Fix constrained type resolution and multiple requires clauses
fabiomadge Mar 2, 2026
610f9c8
Add Array.Get/Length, Seq.Contains, Applied type, arrayTypeSynonym, e…
fabiomadge Mar 2, 2026
f1e6e01
Add constraint assertions, fix defaultExprForType, fix T08 test
fabiomadge Mar 2, 2026
e0a2dbd
All tests pass: output constraints, fix T12 test
fabiomadge Mar 2, 2026
dc1d499
Fix both gaps: remove partial, add collectConstrainedArrayAccesses
fabiomadge Mar 2, 2026
ef6d9df
Make translateSeqBounds total (add termination proof)
fabiomadge Mar 2, 2026
2f1c11c
Remove unused variable warning
fabiomadge Mar 2, 2026
9a58028
Fix constrained type resolution in function output types, constants, …
fabiomadge Mar 2, 2026
16e4ed7
Code quality: unify lookupType with constrained type support, simplif…
fabiomadge Mar 2, 2026
497af00
Remove accidentally committed conversation log
fabiomadge Mar 2, 2026
269114e
Add *.conv to gitignore
fabiomadge Mar 2, 2026
95211cc
Restore postcondition asserts at early return points (soundness fix)
fabiomadge Mar 3, 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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,4 @@
vcs/*.smt2

Strata.code-workspace
*.conv
Original file line number Diff line number Diff line change
Expand Up @@ -74,9 +74,11 @@ def translateBool (arg : Arg) : TransM Bool := do
instance : Inhabited Parameter where
default := { name := "", type := ⟨.TVoid, #[]⟩ }

/-- Create a HighTypeMd with the given metadata -/
def mkHighTypeMd (t : HighType) (md : MetaData Core.Expression) : HighTypeMd := ⟨t, md⟩

/-- Create a StmtExprMd with the given metadata -/
def mkStmtExprMd (e : StmtExpr) (md : MetaData Core.Expression) : StmtExprMd := ⟨e, md⟩
def mkStmtExprMdEmpty (e : StmtExpr) : StmtExprMd := ⟨e, #[]⟩

partial def translateHighType (arg : Arg) : TransM HighTypeMd := do
let md ← getArgMetaData arg
Expand All @@ -86,10 +88,13 @@ partial def translateHighType (arg : Arg) : TransM HighTypeMd := do
| q`Laurel.intType, _ => return mkHighTypeMd .TInt md
| q`Laurel.boolType, _ => return mkHighTypeMd .TBool md
| q`Laurel.stringType, _ => return mkHighTypeMd .TString md
| q`Laurel.arrayType, #[elemArg] =>
let elemType ← translateHighType elemArg
return mkHighTypeMd (.Applied (mkHighTypeMd (.UserDefined "Array") md) [elemType]) md
| q`Laurel.compositeType, #[nameArg] =>
let name ← translateIdent nameArg
return mkHighTypeMd (.UserDefined name) md
| _, _ => TransM.error s!"translateHighType expects intType, boolType, arrayType or compositeType, got {repr op.name}"
| _, _ => TransM.error s!"translateHighType expects intType, boolType, stringType, arrayType or compositeType, got {repr op.name}"
| _ => TransM.error s!"translateHighType expects operation"

def translateNat (arg : Arg) : TransM Nat := do
Expand Down Expand Up @@ -242,6 +247,10 @@ partial def translateStmtExpr (arg : Arg) : TransM StmtExprMd := do
let field ← translateIdent fieldArg
let fieldMd ← getArgMetaData fieldArg
return mkStmtExprMd (.FieldSelect obj field) fieldMd
| q`Laurel.arrayIndex, #[arrArg, idxArg] =>
let arr ← translateStmtExpr arrArg
let idx ← translateStmtExpr idxArg
return mkStmtExprMd (.StaticCall "Array.Get" [arr, idx]) md
| q`Laurel.while, #[condArg, invSeqArg, bodyArg] =>
let cond ← translateStmtExpr condArg
let invariants ← match invSeqArg with
Expand All @@ -253,6 +262,11 @@ partial def translateStmtExpr (arg : Arg) : TransM StmtExprMd := do
| _ => pure []
let body ← translateStmtExpr bodyArg
return mkStmtExprMd (.While cond invariants none body) md
| _, #[arg0] => match getUnaryOp? op.name with
| some primOp =>
let inner ← translateStmtExpr arg0
return mkStmtExprMd (.PrimitiveOp primOp [inner]) md
| none => TransM.error s!"Unknown unary operation: {op.name}"
| q`Laurel.forallExpr, #[nameArg, tyArg, bodyArg] =>
let name ← translateIdent nameArg
let ty ← translateHighType tyArg
Expand All @@ -263,11 +277,6 @@ partial def translateStmtExpr (arg : Arg) : TransM StmtExprMd := do
let ty ← translateHighType tyArg
let body ← translateStmtExpr bodyArg
return mkStmtExprMd (.Exists name ty body) md
| _, #[arg0] => match getUnaryOp? op.name with
| some primOp =>
let inner ← translateStmtExpr arg0
return mkStmtExprMd (.PrimitiveOp primOp [inner]) md
| none => TransM.error s!"Unknown unary operation: {op.name}"
| _, #[arg0, arg1] => match getBinaryOp? op.name with
| some primOp =>
let lhs ← translateStmtExpr arg0
Expand All @@ -278,8 +287,10 @@ partial def translateStmtExpr (arg : Arg) : TransM StmtExprMd := do
| _ => TransM.error s!"translateStmtExpr expects operation"

partial def translateSeqCommand (arg : Arg) : TransM (List StmtExprMd) := do
let .seq _ .none args := arg
| TransM.error s!"translateSeqCommand expects seq"
let args ← match arg with
| .seq _ .none args => pure args
| .seq _ .newline args => pure args -- NewlineSepBy for block statements
| _ => TransM.error s!"translateSeqCommand expects seq or newlineSepBy"
let mut stmts : List StmtExprMd := []
for arg in args do
let stmt ← translateStmtExpr arg
Expand Down Expand Up @@ -356,15 +367,20 @@ def parseProcedure (arg : Arg) : TransM Procedure := do
| .option _ none => pure []
| _ => TransM.error s!"Expected returnParameters operation, got {repr returnParamsArg}"
| _ => TransM.error s!"Expected optionalReturnType operation, got {repr returnTypeArg}"
-- Parse preconditions (requires clause)
-- Parse preconditions (requires clauses)
let preconditions ← match requiresArg with
| .option _ (some (.op requiresOp)) => match requiresOp.name, requiresOp.args with
| q`Laurel.optionalRequires, #[exprArg] => do
let precond ← translateStmtExpr exprArg
pure [precond]
| _, _ => TransM.error s!"Expected optionalRequires operation, got {repr requiresOp.name}"
| .option _ none => pure []
| _ => TransM.error s!"Expected optionalRequires operation, got {repr requiresArg}"
| .seq _ _ clauses => clauses.toList.mapM fun arg => match arg with
| .op reqOp => match reqOp.name, reqOp.args with
| q`Laurel.requiresClause, #[exprArg] => translateStmtExpr exprArg
| _, _ => TransM.error "Expected requiresClause"
| _ => TransM.error "Expected operation"
| _ => pure []
-- Parse postconditions (ensures clauses - zero or more)
let postconditions ← translateEnsuresClauses ensuresArg
-- Parse modifies clauses (zero or more)
Expand Down Expand Up @@ -398,6 +414,20 @@ def parseProcedure (arg : Arg) : TransM Procedure := do
| _, _ =>
TransM.error s!"parseProcedure expects procedure or function, got {repr op.name}"

def parseConstrainedType (arg : Arg) : TransM ConstrainedType := do
let .op op := arg
| TransM.error s!"parseConstrainedType expects operation"
match op.name, op.args with
| q`Laurel.constrainedType, #[nameArg, valueNameArg, baseArg, constraintArg, witnessArg] =>
let name ← translateIdent nameArg
let valueName ← translateIdent valueNameArg
let base ← translateHighType baseArg
let constraint ← translateStmtExpr constraintArg
let witness ← translateStmtExpr witnessArg
return { name, base, valueName, constraint, witness }
| _, _ =>
TransM.error s!"parseConstrainedType expects constrainedType, got {repr op.name}"

def parseField (arg : Arg) : TransM Field := do
let .op op := arg
| TransM.error s!"parseField expects operation"
Expand Down Expand Up @@ -435,19 +465,26 @@ def parseComposite (arg : Arg) : TransM TypeDefinition := do
| _, _ =>
TransM.error s!"parseComposite expects composite, got {repr op.name}"

def parseTopLevel (arg : Arg) : TransM (Option Procedure × Option TypeDefinition) := do
inductive TopLevelItem where
| proc (p : Procedure)
| typeDef (t : TypeDefinition)

def parseTopLevel (arg : Arg) : TransM (Option TopLevelItem) := do
let .op op := arg
| TransM.error s!"parseTopLevel expects operation"

match op.name, op.args with
| q`Laurel.topLevelProcedure, #[procArg] =>
let proc ← parseProcedure procArg
return (some proc, none)
return some (.proc proc)
| q`Laurel.topLevelComposite, #[compositeArg] =>
let typeDef ← parseComposite compositeArg
return (none, some typeDef)
return some (.typeDef typeDef)
| q`Laurel.topLevelConstrainedType, #[ctArg] =>
let ct ← parseConstrainedType ctArg
return some (.typeDef (.Constrained ct))
| _, _ =>
TransM.error s!"parseTopLevel expects topLevelProcedure or topLevelComposite, got {repr op.name}"
TransM.error s!"parseTopLevel expects topLevelProcedure, topLevelComposite, or topLevelConstrainedType, got {repr op.name}"

/--
Translate concrete Laurel syntax into abstract Laurel syntax
Expand All @@ -471,13 +508,11 @@ def parseProgram (prog : Strata.Program) : TransM Laurel.Program := do
let mut procedures : List Procedure := []
let mut types : List TypeDefinition := []
for op in commands do
let (procOpt, typeOpt) ← parseTopLevel (.op op)
match procOpt with
| some proc => procedures := procedures ++ [proc]
| none => pure ()
match typeOpt with
| some typeDef => types := types ++ [typeDef]
| none => pure ()
let result ← parseTopLevel (.op op)
match result with
| some (.proc proc) => procedures := procedures ++ [proc]
| some (.typeDef td) => types := types ++ [td]
| none => pure () -- composite types are skipped for now
return {
staticProcedures := procedures
staticFields := []
Expand Down
2 changes: 2 additions & 0 deletions Strata/Languages/Laurel/Grammar/LaurelGrammar.lean
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,5 @@ import Strata.DDM.Integration.Lean
namespace Strata.Laurel

#load_dialect "./LaurelGrammar.st"
-- Rebuild trigger: merged grammar
-- Grammar updated for multiple requires
21 changes: 16 additions & 5 deletions Strata/Languages/Laurel/Grammar/LaurelGrammar.st
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ category LaurelType;
op intType : LaurelType => "int";
op boolType : LaurelType => "bool";
op stringType : LaurelType => "string";
op arrayType (elemType: LaurelType): LaurelType => "Array" "<" elemType ">";
op compositeType (name: Ident): LaurelType => name;

category StmtExpr;
Expand All @@ -32,6 +33,9 @@ op new(name: Ident): StmtExpr => "new " name;
// Field access
op fieldAccess (obj: StmtExpr, field: Ident): StmtExpr => @[prec(90)] obj "#" field;

// Array indexing
op arrayIndex (arr: StmtExpr, idx: StmtExpr): StmtExpr => @[prec(90)] arr "[" idx "]";

// Identifiers/Variables - must come after fieldAccess so c.value parses as fieldAccess not identifier
op identifier (name: Ident): StmtExpr => name;
op parenthesis (inner: StmtExpr): StmtExpr => "(" inner ")";
Expand Down Expand Up @@ -110,11 +114,11 @@ op composite (name: Ident, extending: Option OptionalExtends, fields: Seq Field)
category OptionalReturnType;
op optionalReturnType(returnType: LaurelType): OptionalReturnType => ":" returnType;

category OptionalRequires;
op optionalRequires(cond: StmtExpr): OptionalRequires => "requires" cond:0;
category RequiresClause;
op requiresClause(cond: StmtExpr): RequiresClause => "requires " cond:0;

category EnsuresClause;
op ensuresClause(cond: StmtExpr): EnsuresClause => "ensures" cond:0;
op ensuresClause(cond: StmtExpr): EnsuresClause => "ensures " cond:0;

category ModifiesClause;
op modifiesClause(refs: CommaSepBy StmtExpr): ModifiesClause => "modifies" refs;
Expand All @@ -129,7 +133,7 @@ category Procedure;
op procedure (name : Ident, parameters: CommaSepBy Parameter,
returnType: Option OptionalReturnType,
returnParameters: Option ReturnParameters,
requires: Option OptionalRequires,
requires: NewlineSepBy RequiresClause,
ensures: Seq EnsuresClause,
modifies: Seq ModifiesClause,
body : Option OptionalBody) : Procedure =>
Expand All @@ -138,14 +142,21 @@ op procedure (name : Ident, parameters: CommaSepBy Parameter,
op function (name : Ident, parameters: CommaSepBy Parameter,
returnType: Option OptionalReturnType,
returnParameters: Option ReturnParameters,
requires: Option OptionalRequires,
requires: NewlineSepBy RequiresClause,
ensures: Seq EnsuresClause,
modifies: Seq ModifiesClause,
body : Option OptionalBody) : Procedure =>
"function " name "(" parameters ")" returnType returnParameters requires ensures modifies body;

// Constrained types
category ConstrainedType;
op constrainedType (name: Ident, valueName: Ident, base: LaurelType,
constraint: StmtExpr, witness: StmtExpr): ConstrainedType
=> "constrained " name " = " valueName ": " base " where " constraint:0 " witness " witness:0;

category TopLevel;
op topLevelComposite(composite: Composite): TopLevel => composite;
op topLevelProcedure(procedure: Procedure): TopLevel => procedure;
op topLevelConstrainedType(ct: ConstrainedType): TopLevel => ct;

op program (items: Seq TopLevel): Command => items;
16 changes: 8 additions & 8 deletions Strata/Languages/Laurel/LaurelEval.lean
Original file line number Diff line number Diff line change
Expand Up @@ -252,20 +252,20 @@ partial def eval (expr : StmtExpr) : Eval TypedValue :=
let tv ← eval valExpr
withResult (EvalResult.Return tv.val)
| StmtExpr.Return none => fun env => (EvalResult.Success { val := Value.VVoid, ty := env.returnType }, env)
| StmtExpr.While _ [] none _ => withResult <| EvalResult.TypeError "While invariant was not derived"
| StmtExpr.While _ none _ _ => withResult <| EvalResult.TypeError "While invariant was not derived"
| StmtExpr.While _ _ none _ => withResult <| EvalResult.TypeError "While decreases was not derived"
| StmtExpr.While condExpr invariantExprs (some decreasedExpr) bodyExpr => do
| StmtExpr.While condExpr (some invariantExpr) (some decreasedExpr) bodyExpr => do
let rec loop : Eval TypedValue := do
let cond ← eval condExpr
if (cond.ty.isBool) then
withResult <| EvalResult.TypeError "Condition must be boolean"
else if cond.val.asBool! then
for invariantExpr in invariantExprs do
let invariant ← eval invariantExpr
if (invariant.ty.isBool) then
withResult <| EvalResult.TypeError "Invariant must be boolean"
else if (!invariant.val.asBool!) then
withResult <| EvalResult.VerficationError VerificationErrorType.InvariantFailed "While invariant does not hold"
let invariant ← eval invariantExpr
if (invariant.ty.isBool) then
withResult <| EvalResult.TypeError "Invariant must be boolean"
else if (!invariant.val.asBool!) then
withResult <| EvalResult.VerficationError VerificationErrorType.InvariantFailed "While invariant does not hold"
else
-- TODO handle decreases
fun env => match eval bodyExpr env with
| (EvalResult.Success _, env') => loop env'
Expand Down
Loading
Loading