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