aboutsummaryrefslogtreecommitdiff
path: root/bnf
diff options
context:
space:
mode:
authorCori Barker <coribarker2@gmail.com>2026-02-23 15:45:03 +0000
committerCori Barker <coribarker2@gmail.com>2026-02-23 15:45:03 +0000
commit4b33b1f31862cd505fd9c90cf8d2e696c6f6ec97 (patch)
treefa2c5cd9aec9fed35dd482b60237e52d26203bfe /bnf
parent5c1f937a7eb7a9cc9cd86cb69b3263f41f24408f (diff)
partial refactor of ast_node.hpp
Diffstat (limited to 'bnf')
-rw-r--r--bnf115
1 files changed, 115 insertions, 0 deletions
diff --git a/bnf b/bnf
new file mode 100644
index 0000000..cc49d87
--- /dev/null
+++ b/bnf
@@ -0,0 +1,115 @@
+<program> ::= { <function_declaration> }
+
+<function_declaration> ::=
+ "function" <identifier> "(" [ <parameter_list> ] ")"
+ "->" <type>
+ <block>
+
+<parameter_list> ::= <parameter> { "," <parameter> }
+
+<parameter> ::= <type> <identifier>
+
+<type> ::= "int"
+ | "bool"
+
+
+<block> ::= "{"
+ <statement_list>
+ "}"
+
+<statement_list> ::= { <statement> }
+
+<statement> ::= <variable_declaration>
+ | <assignment_statement>
+ | <if_statement>
+ | <while_statement>
+ | <for_statement>
+ | <return_statement>
+ | <expression_statement>
+
+
+<variable_declaration> ::=
+ <type> <identifier> [ "=" <expression> ] ";"
+
+<assignment_statement> ::=
+ <identifier> "=" <expression> ";"
+
+<return_statement> ::=
+ "return" [ <expression> ] ";"
+
+<expression_statement> ::=
+ <expression> ";"
+
+
+<if_statement> ::=
+ "if" "(" <expression> ")"
+ <block>
+ [ "else" <block> ]
+
+<while_statement> ::=
+ "while" "(" <expression> ")"
+ <block>
+
+<for_statement> ::=
+ "for" "("
+ [ <for_init> ]
+ ";"
+ [ <expression> ]
+ ";"
+ [ <expression> ]
+ ")"
+ <block>
+
+<for_init> ::= <type> <identifier> [ "=" <expression> ]
+ | <expression>
+
+
+<expression> ::= <logical_or>
+
+<logical_or> ::= <logical_and>
+ { "||" <logical_and> }
+
+<logical_and> ::= <equality>
+ { "&&" <equality> }
+
+<equality> ::= <comparison>
+ { ( "==" | "!=" ) <comparison> }
+
+<comparison> ::= <term>
+ { ( "<" | ">" | "<=" | ">=" ) <term> }
+
+<term> ::= <factor>
+ { ( "+" | "-" ) <factor> }
+
+<factor> ::= <unary>
+ { ( "*" | "/" | "%" ) <unary> }
+
+<unary> ::= ( "!" | "-" ) <unary>
+ | <primary>
+
+<primary> ::= <number>
+ | <boolean>
+ | <identifier>
+ | <function_call>
+ | "(" <expression> ")"
+
+
+<function_call> ::=
+ <identifier> "(" [ <argument_list> ] ")"
+
+<argument_list> ::= <expression>
+ { "," <expression> }
+
+
+<identifier> ::= <letter> { <letter> | <digit> }
+
+<number> ::= <digit> { <digit> }
+
+<boolean> ::= "true"
+ | "false"
+
+<letter> ::= "a" | ... | "z"
+ | "A" | ... | "Z"
+ | "_"
+
+<digit> ::= "0" | ... | "9" \ No newline at end of file