- type Identifier = string //names
- type Constant = string //numbers
- type StringLiteral = string //"string"
- //almost normal C-Style Expressions, except for some
- //additional braces during postfix and unary expressions
- type PrimaryExpression =
- | Constant of Constant
- | StringLiteral of StringLiteral
- | Identifier of Identifier
- | Expression of Expression
- and PostfixExpression =
- | None
- | ArrayExpression of PrimaryExpression * Expression list
- | CallExpression of PrimaryExpression * Expression list
- | MemberExpression of PrimaryExpression * Identifier list //we dont want braces when chaining member expressions
- | PostIncrement of PrimaryExpression
- | PostDecrement of PrimaryExpression
- and UnaryExpression =
- | None
- | Increment of PrimaryExpression
- | Decrement of PrimaryExpression
- | SizeOf of PrimaryExpression
- | TypeOf of PrimaryExpression
- | Minus of PrimaryExpression
- | Not of PrimaryExpression
- | Invert of PrimaryExpression
- and BinaryExpression =
- | None
- | Multiply of Expression * Expression
- | Divide of Expression * Expression
- | Modulo of Expression * Expression
- | Add of Expression * Expression
- | Sub of Expression * Expression
- | Left of Expression * Expression
- | Right of Expression * Expression
- | Less of Expression * Expression
- | Greater of Expression * Expression
- | LEqual of Expression * Expression
- | GEqual of Expression * Expression
- | Equal of Expression * Expression
- | NEqual of Expression * Expression
- | And of Expression * Expression
- | Xor of Expression * Expression
- | Or of Expression * Expression
- | LogicalAnd of Expression * Expression
- | LogicalOr of Expression * Expression
- and Expression =
- | PrimaryExpression of PrimaryExpression
- | UnaryExpression of UnaryExpression
- | PostfixExpression of PostfixExpression
- | BinaryExpression of BinaryExpression
- | TupleExpression of TupleSpecifier * Expression list //constructs anonymous union or struct
- | StatementExpression of Statement
- and TupleSpecifier =
- | Struct //when struct everything works as expected
- | Union //when union the first valid expression is used (similar to try catch)
- and Statement =
- | If of PrimaryExpression * Expression //if ( [Expression] ) [Expression], please note that braces are forced on complex stuff
- | IfElse of PrimaryExpression * Expression * Expression //same as if but also wraps the else path
- | While of PrimaryExpression * Expression //while ( [Expression] ) [Expression]
- | Switch of PrimaryExpression * SwitchExpression list //Switch (Expression) { Cases }
- | Expression of Expression //used when doing declarations
- and SwitchExpression =
- | Case of PrimaryExpression * Expression //case [Expression] : [Expression]
- | Default of Expression //default : [Expression]