# Base grammar

A few rules to start the formal language definition. (They will slowly get more readable as soon as I get confidence with the wiki)

```PROGRAM ::= <COMMAND> | ${\displaystyle \Lambda }$
```
```COMMAND ::= HELP_QUERY (newline)
| PACKAGE_DECL
| FUNCTION_DECL
| STATEMENT;
```
```HELP_QUERY ::= ? <*>
```
```PACKAGE_DECL ::= Package PACKAGE_ID <FUNCTION_DECL> End[Package]
```
```FUNCTION_DECL ::= Define IDENTIFIER(PARAMS) STATEMENTS End[Define]
| Define [Internal/External] IDENTIFIER(PARAMS)
```
```PARAMS ::= <PARAM ,>
```
```PARAM ::= [TYPE] IDENTIFIER
```
```STATEMENT ::= ${\displaystyle \Lambda }$
| ASSIGNMENT
| EXPRESSION
| [[FUNCTION_CALL]
| Return [ EXPRESSION ]
| Print EXPRESSIONS
| PrintLn [ EXPRESSIONS ]
| If EXPRESSION Then STATEMENTS [ ELSE_LIST ] End[If]
| While EXPRESSION Do STATEMENTS End[While]
| Repeat STATEMENTS Until EXPRESSION
| For IDENTIFIER := EXPRESSION To EXPRESSION [ Step EXPRESSION ]
Do STATEMENTS End[For]
| ForEach IDENTIFIER In EXPRESSION Do STATEMENTS End[ForEach]
| Break
| Block STATEMENTS End[Block]
| Declare [ TYPE ] <IDENTIFIER ,>
| Delete <IDENTIFIER ,>
| Quit
```
```ASSIGNMENT ::= LEFT_EXPRESSION := EXPRESSION
```
```LEFT_EXPR ::= IDENTIFIER
| LEFT_EXPR.IDENTIFIER
| LEFT_EXPR.[<EXPRESSION ,>]
```
```FUNCTION_CALL ::= FUNCTION_ID(<EXPRESSION ,>)
```
```FUNCTION_ID ::= IDENTIFIER | EXPRESSION.IDENTIFIER | PACKAGE_ID.IDENTIFIER
```