Skip to content

Latest commit

 

History

History
142 lines (94 loc) · 3.49 KB

File metadata and controls

142 lines (94 loc) · 3.49 KB

Zoisite Language BNF

Program Structure

<root> ::= <statement>* <eof>

Statements

<statement> ::= <let_statement>
              | <let_tuple_statement>
              | <while_statement>
              | <break_statement>
              | <continue_statement>
              | <expression_statement>
              | <empty_statement>
              | <function_definition>

<let_statement> ::= "let" <typed_identifier> "=" <expression> ";"

<let_tuple_statement> ::= "let" "(" <typed_identifier> ( "," <typed_identifier> )* [ "," ] ")" "=" <expression> ";"

<while_statement> ::= "while" "(" <expression> ")" <expression>

<break_statement> ::= "break" ";"

<continue_statement> ::= "continue" ";"

<expression_statement> ::= <expression> ";"

<empty_statement> ::= ";"

Function Definition

<function_definition> ::= "fun" <identifier> <parameter_list> ":" <type_specifier> <block_expr>

<parameter_list> ::= "(" [ <typed_identifier> ( "," <typed_identifier> )* ] ")"

<typed_identifier> ::= <identifier> [ ":" <type_specifier> ]

Expressions

<expression> ::= <assignment_expr> | <logical_expr>

<assignment_expr> ::= <lvalue> "=" <expression>

<lvalue> ::= <identifier>
           | <lvalue> <index_suffix>
           | "(" <lvalue> ( "," <lvalue> )* [ "," ] ")"

<logical_expr> ::= <comparison_expr> ( ( "&&" | "||" ) <comparison_expr> )*

<comparison_expr> ::= <additive_expr> ( ( "==" | "!=" | "<" | ">" | "<=" | ">=" ) <additive_expr> )*

<additive_expr> ::= <multiplicative_expr> ( ( "+" | "-" ) <multiplicative_expr> )*

<multiplicative_expr> ::= <unary_expr> ( ( "*" | "/" | "%" ) <unary_expr> )*

<unary_expr> ::= <prefix_expr> | <postfix_expr>

<prefix_expr> ::= "-" <unary_expr>

<postfix_expr> ::= <primary_expr> ( <call_suffix> | <index_suffix> )*

<call_suffix> ::= "(" [ <argument_list> ] ")"

<index_suffix> ::= "[" <expression> "]"

<argument_list> ::= <expression> ( "," <expression> )*

<primary_expr> ::= <literal>
                 | <identifier>
                 | <paren_expr>
                 | <tuple_expr>
                 | <block_expr>
                 | <array_literal>
                 | <if_expr>

<paren_expr> ::= "(" <expression> ")"

<tuple_expr> ::= "(" <expression> ( "," <expression> )* [ "," ] ")"

<block_expr> ::= "{" <statement>* [ <expression> ] "}"

<if_expr> ::= "if" "(" <expression> ")" <expression> [ "else" <expression> ]

<array_literal> ::= "[" <expression> ";" <expression> ( "," <expression> )* "]"

Literals

<literal> ::= <integer_literal>
            | <float_literal>
            | <string_literal>
            | <char_literal>
            | <bool_literal>
            | <none_literal>

<integer_literal> ::= <digit>+
<float_literal> ::= <digit>+ "." <digit>*
<string_literal> ::= '"' ( <character> )* '"'
<char_literal> ::= "'" ( <character> ) "'"
<bool_literal> ::= "true" | "false"
<none_literal> ::= "none"

Type Specifiers

<type_specifier> ::= <base_type_spec> ( <type_modifier> )*

<base_type_spec> ::= <ident_type_spec> | <tuple_type_spec>

<ident_type_spec> ::= <identifier>

<tuple_type_spec> ::= "(" <type_specifier> ( "," <type_specifier> )+ ")"

<type_modifier> ::= "[" "]" | "?"

Lexical Elements

<identifier> ::= ( <letter> | "_" ) ( <letter> | <digit> | "_" )*
<letter> ::= "a"..."z" | "A"..."Z"
<digit> ::= "0"..."9"
<character> ::= /* any valid character within strings/chars */
<eof> ::= /* end of input */

Comments

<comment> ::= "//" /* any sequence of characters except newline */