crosslang/octive-lean/OctiveLean/AST.lean
Maximus Gorog 6592cd058d Add 'octive-lean/' from commit '4b6fcec565a170d7029d4ccba21be2ecd0512d13'
git-subtree-dir: octive-lean
git-subtree-mainline: fd3d42ae33
git-subtree-split: 4b6fcec565
2026-05-12 02:59:14 -06:00

93 lines
3.3 KiB
Text
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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