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]