module Language.Lua.Syntax where
import Prelude hiding (LT, EQ, GT)
import Data.Data
type Name = String
data Stat
= Assign [Var] [Exp]
| FunCall FunCall
| Label Name
| Break
| Goto Name
| Do Block
| While Exp Block
| Repeat Block Exp
| If [(Exp, Block)] (Maybe Block)
| ForRange Name Exp Exp (Maybe Exp) Block
| ForIn [Name] [Exp] Block
| FunAssign FunName FunBody
| LocalFunAssign Name FunBody
| LocalAssign [Name] (Maybe [Exp])
| EmptyStat
deriving (Show, Eq, Data, Typeable)
data Exp
= Nil
| Bool Bool
| Number String
| String String
| Vararg
| EFunDef FunBody
| PrefixExp PrefixExp
| TableConst [TableField]
| Binop Binop Exp Exp
| Unop Unop Exp
deriving (Show, Eq, Data, Typeable)
data Var
= VarName Name
| Select PrefixExp Exp
| SelectName PrefixExp Name
deriving (Show, Eq, Data, Typeable)
data Binop = Add | Sub | Mul | Div | Exp | Mod | Concat
| LT | LTE | GT | GTE | EQ | NEQ | And | Or
deriving (Show, Eq, Data, Typeable)
data Unop = Neg | Not | Len
deriving (Show, Eq, Data, Typeable)
data PrefixExp
= PEVar Var
| PEFunCall FunCall
| Paren Exp
deriving (Show, Eq, Data, Typeable)
data TableField
= ExpField Exp Exp
| NamedField Name Exp
| Field Exp
deriving (Show, Eq, Data, Typeable)
data Block = Block [Stat] (Maybe [Exp])
deriving (Show, Eq, Data, Typeable)
data FunName = FunName Name [Name] (Maybe Name)
deriving (Show, Eq, Data, Typeable)
data FunBody = FunBody [Name] Bool Block
deriving (Show, Eq, Data, Typeable)
data FunCall
= NormalFunCall PrefixExp FunArg
| MethodCall PrefixExp Name FunArg
deriving (Show, Eq, Data, Typeable)
data FunArg
= Args [Exp]
| TableArg [TableField]
| StringArg String
deriving (Show, Eq, Data, Typeable)