Syntax

Backus-Naur Form (BNF)

<program> ::= <statement>*

<statement> ::= <class_declaration>
               | <function_declaration>
               | <variable_declaration>
               | <expression> ";"
               | <print_statement> ";"
               | <return_statement> ";"
               | <if_statement>
               | <for_statement>
               | <while_statement>
               | <comment>

<class_declaration> ::= "class" <identifier> [":" <identifier>] "{" <method>* "}"
<method> ::= <function_declaration>

<function_declaration> ::= "fun" <identifier> "(" [<parameter_list>] ")" "{" <statement>* "}"
<parameter_list> ::= <identifier> ("," <identifier>)*

<variable_declaration> ::= "var" <identifier> [":" <type>] "=" <expression> ";"
<type> ::= "Int" | "String" | "Double" | "Bool" | <list_type>
<list_type> ::= "list[" <type> "]"

<expression> ::= <literal>
               | <identifier>
               | <function_call>
               | <binary_expression>
               | <unary_expression>
               | <ternary_expression>

<function_call> ::= <identifier> "(" [<argument_list>] ")"
<argument_list> ::= <expression> ("," <expression>)*

<binary_expression> ::= <expression> <binary_operator> <expression>
<binary_operator> ::= "+" | "-" | "*" | "/" | "==" | "!=" | "<" | "<=" | ">" | ">="

<unary_expression> ::= "-" <expression>
<ternary_expression> ::= <expression> "?" <expression> ":" <expression>

<literal> ::= <integer_literal>
            | <string_literal>
            | <double_literal>
            | <boolean_literal>
            | <list_literal>

<integer_literal> ::= <digit>+
<string_literal> ::= "\"" <char>* "\""
<double_literal> ::= <digit>+ "." <digit>*
<boolean_literal> ::= "true" | "false"
<list_literal> ::= "[" [<expression> ("," <expression>)*] "]"

<print_statement> ::= "print" "(" <expression> ")" | "println" "(" <expression> ")"

<return_statement> ::= "return" <expression>

<if_statement> ::= "if" "(" <expression> ")" "{" <statement>* "}" ["else" "{" <statement>* "}"]

<for_statement> ::= "for" "(" <for_clause> ")" <statement_block>
<for_clause> ::= <variable_declaration> <expression> ";" <expression>
               | <variable_declaration> <expression>
               | <expression> ";" <expression>
               | <expression>
               | ""
<statement_block> ::= <statement> | "{" <statement>* "}"

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

<comment> ::= "//" <char>*

<identifier> ::= <letter> (<letter> | <digit>)*
<digit> ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
<letter> ::= "a" | "b" | "c" | ... | "z" | "A" | "B" | ... | "Z"

Last updated