git-subtree-dir: octive-lean git-subtree-mainline:fd3d42ae33git-subtree-split:4b6fcec565
93 lines
3.3 KiB
Text
93 lines
3.3 KiB
Text
namespace OctiveLean
|
||
|
||
/-! Operators -/
|
||
|
||
inductive BinOp where
|
||
-- arithmetic
|
||
| add | sub | mul | div | ldiv | pow
|
||
-- element-wise
|
||
| emul | ediv | eldiv | epow
|
||
-- comparison
|
||
| lt | le | gt | ge | eq | ne
|
||
-- bitwise / logical
|
||
| band | bor | land | lor
|
||
deriving Repr, BEq, Inhabited
|
||
|
||
inductive UnOp where
|
||
| neg | uplus | lnot | transpose | htranspose
|
||
deriving Repr, BEq, Inhabited
|
||
|
||
/-! Literals -/
|
||
|
||
inductive Literal where
|
||
| float : Float → Literal
|
||
| int : Int → Literal
|
||
| str : String → Literal
|
||
| bool : Bool → Literal
|
||
deriving Repr, BEq
|
||
|
||
/-! AST (mutually recursive: Expr ↔ Arg, Stmt ↔ FuncDef) -/
|
||
|
||
mutual
|
||
|
||
/-- An Octave expression -/
|
||
inductive Expr where
|
||
| lit : Literal → Expr
|
||
| ident : String → Expr
|
||
| binop : BinOp → Expr → Expr → Expr
|
||
| unop : UnOp → Expr → Expr
|
||
| index : Expr → Array Arg → Expr -- f(a,b) or A(i,j)
|
||
| dotIndex : Expr → String → Expr -- s.field
|
||
| dynField : Expr → Expr → Expr -- s.(expr)
|
||
| matrix : Array (Array Expr) → Expr -- [a b; c d]
|
||
| cellArr : Array (Array Expr) → Expr -- {a b; c d}
|
||
| range : Expr → Option Expr → Expr → Expr -- a:b or a:step:b
|
||
| fnHandle : String → Expr -- @name
|
||
| anon : Array String → Expr → Expr -- @(x,y) expr
|
||
| endIdx : Expr -- 'end' inside index
|
||
| colonIdx : Expr -- bare ':' inside index
|
||
|
||
/-- An argument in a call or index expression -/
|
||
inductive Arg where
|
||
| pos : Expr → Arg -- positional expression
|
||
| colon : Arg -- bare :
|
||
| kw : String → Expr → Arg -- name = value (not standard Octave but useful)
|
||
|
||
/-- A statement -/
|
||
inductive Stmt where
|
||
| exprS : Expr → Bool → Stmt -- expr; silent?
|
||
| assign : Array String → Expr → Bool → Stmt -- [a,b]=rhs silent?
|
||
| indexAssign : Expr → Expr → Bool → Stmt -- lhs(...)=rhs / lhs.f=rhs
|
||
| ifS : Expr → Array Stmt
|
||
→ Array (Expr × Array Stmt)
|
||
→ Option (Array Stmt) → Stmt
|
||
| forS : String → Expr → Array Stmt → Stmt
|
||
| whileS : Expr → Array Stmt → Stmt
|
||
| doUntil : Array Stmt → Expr → Stmt
|
||
| returnS : Stmt
|
||
| breakS : Stmt
|
||
| continueS : Stmt
|
||
| funcDefS : FuncDef → Stmt
|
||
| switchS : Expr
|
||
→ Array (Expr × Array Stmt)
|
||
→ Option (Array Stmt) → Stmt
|
||
| tryS : Array Stmt → Option (String × Array Stmt) → Stmt
|
||
| globalS : Array String → Stmt
|
||
| persistS : Array String → Stmt
|
||
| clearS : Array String → Stmt
|
||
| unwindS : Array Stmt → Array Stmt → Stmt
|
||
|
||
/-- A function definition (name, params, return vars, body) -/
|
||
inductive FuncDef where
|
||
| mk : String → Array String → Array String → Array Stmt → FuncDef
|
||
|
||
end
|
||
|
||
namespace FuncDef
|
||
def name : FuncDef → String | .mk n _ _ _ => n
|
||
def params : FuncDef → Array String | .mk _ p _ _ => p
|
||
def retVals : FuncDef → Array String | .mk _ _ r _ => r
|
||
def body : FuncDef → Array Stmt | .mk _ _ _ b => b
|
||
end FuncDef
|
||
|
||
end OctiveLean
|