@@ -2,46 +2,46 @@ WHITESPACE = _{ " " | "\t" | "\n" | "\r" }
22
33program = { SOI ~ statement* ~ EOI }
44
5- statement = _{
6- var_decl
7- | assign
8- | print_stmt
9- | if_stmt
10- | loop_stmt
11- | fn_decl
12- | fn_call
13- | command
14- | expr ~ ";"?
5+ statement = _{
6+ var_decl
7+ | assign
8+ | print_stmt
9+ | if_stmt
10+ | loop_stmt
11+ | fn_decl
12+ | fn_call
13+ | command
14+ | expr ~ ";"?
1515 | comment
1616}
1717
1818comment = { "!" ~ (!"\n" ~ ANY)* ~ ("\n" | EOI) }
1919
20- var_decl = {
21- ( "let" | "var" ) ~ WHITESPACE+ ~ ident ~ ( ":" ~ type_name )? ~ WHITESPACE* ~ "=" ~ WHITESPACE* ~ expr ~ ";"?
20+ var_decl = {
21+ ( "let" | "var" ) ~ WHITESPACE+ ~ ident ~ ( ":" ~ type_name )? ~ WHITESPACE* ~ "=" ~ WHITESPACE* ~ expr ~ ";"?
2222}
2323
2424assign = { ident ~ WHITESPACE* ~ "=" ~ WHITESPACE* ~ expr ~ ";"? }
2525
2626type_name = @{ ascii_alpha+ } // e.g., i32, String, etc. (uproszczone)
2727
28- print_stmt = {
29- ( "print" | "println!" | "writeln" ) ~ WHITESPACE* ~ "("? ~ expr ~ ")"? ~ ";"?
28+ print_stmt = {
29+ ( "print" | "println!" | "writeln" ) ~ WHITESPACE* ~ "("? ~ expr ~ ")"? ~ ";"?
3030}
3131
32- if_stmt = {
33- "if" ~ WHITESPACE+ ~ expr ~ WHITESPACE* ~ block
34- ~ ( WHITESPACE* ~ "else" ~ WHITESPACE* ~ block )?
32+ if_stmt = {
33+ "if" ~ WHITESPACE+ ~ expr ~ WHITESPACE* ~ block
34+ ~ ( WHITESPACE* ~ "else" ~ WHITESPACE* ~ block )?
3535}
3636
37- loop_stmt = {
37+ loop_stmt = {
3838 "loop" ~ WHITESPACE* ~ ( expr ~ WHITESPACE* )? ~ block // loop { ... } lub loop 5 { ... }
3939 | "while" ~ WHITESPACE+ ~ expr ~ WHITESPACE* ~ block
4040 | "for" ~ WHITESPACE+ ~ ident ~ WHITESPACE+ ~ "in" ~ WHITESPACE+ ~ expr ~ WHITESPACE* ~ block // for x in range
4141}
4242
43- fn_decl = {
44- ( "fn" | "def" ) ~ WHITESPACE+ ~ ident ~ WHITESPACE* ~ "(" ~ param_list? ~ ")" ~ WHITESPACE* ~ block
43+ fn_decl = {
44+ ( "fn" | "def" ) ~ WHITESPACE+ ~ ident ~ WHITESPACE* ~ "(" ~ param_list? ~ ")" ~ WHITESPACE* ~ block
4545}
4646
4747param_list = { param ~ ( "," ~ WHITESPACE* ~ param )* }
@@ -54,14 +54,16 @@ arg_list = { expr ~ ( "," ~ WHITESPACE* ~ expr )* }
5454
5555command = { ">" ~ WHITESPACE* ~ (!"\n" ~ ANY)* ~ ("\n" | EOI) } // > echo "hello"
5656
57- block = _{
58- "{" ~ statement* ~ "}"
57+ block = _{
58+ "{" ~ statement* ~ "}"
5959 | "then" ~ statement* ~ "end" ~ ( "if" | "" )? // Delphi/Ruby style
6060 | "do" ~ statement* ~ "end" // Ruby style
6161 | "begin" ~ statement* ~ "end" ~ ";"? // Delphi
6262}
6363
64- expr = { logic_expr }
64+ expr = { range | logic_expr }
65+
66+ range = { arith_expr ~ ".." ~ arith_expr }
6567
6668logic_expr = { compare_expr ~ ( WHITESPACE* ~ ( "&&" | "||" | "and" | "or" ) ~ WHITESPACE* ~ compare_expr )* }
6769
@@ -71,12 +73,12 @@ arith_expr = { term ~ ( WHITESPACE* ~ ( "+" | "-" ) ~ WHITESPACE* ~ term )* }
7173
7274term = { factor ~ ( WHITESPACE* ~ ( "*" | "/" | "%" ) ~ WHITESPACE* ~ factor )* }
7375
74- factor = _{
75- "(" ~ expr ~ ")"
76- | literal
77- | ident
76+ factor = _{
77+ "(" ~ expr ~ ")"
78+ | literal
79+ | ident
7880 | fn_call // Allow calls in expr
79- | unary
81+ | unary
8082}
8183
8284unary = { ( "!" | "-" ) ~ factor }
0 commit comments