|
| 1 | +WHITESPACE = _{ " " | "\t" | "\n" | "\r" } |
| 2 | + |
| 3 | +program = { SOI ~ statement* ~ EOI } |
| 4 | + |
| 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 ~ ";"? |
| 15 | + | comment |
| 16 | +} |
| 17 | + |
| 18 | +comment = { "!" ~ (!"\n" ~ ANY)* ~ ("\n" | EOI) } |
| 19 | + |
| 20 | +var_decl = { |
| 21 | + ( "let" | "var" ) ~ WHITESPACE+ ~ ident ~ ( ":" ~ type_name )? ~ WHITESPACE* ~ "=" ~ WHITESPACE* ~ expr ~ ";"? |
| 22 | +} |
| 23 | + |
| 24 | +assign = { ident ~ WHITESPACE* ~ "=" ~ WHITESPACE* ~ expr ~ ";"? } |
| 25 | + |
| 26 | +type_name = @{ ascii_alpha+ } // e.g., i32, String, etc. (uproszczone) |
| 27 | + |
| 28 | +print_stmt = { |
| 29 | + ( "print" | "println!" | "writeln" ) ~ WHITESPACE* ~ "("? ~ expr ~ ")"? ~ ";"? |
| 30 | +} |
| 31 | + |
| 32 | +if_stmt = { |
| 33 | + "if" ~ WHITESPACE+ ~ expr ~ WHITESPACE* ~ block |
| 34 | + ~ ( WHITESPACE* ~ "else" ~ WHITESPACE* ~ block )? |
| 35 | +} |
| 36 | + |
| 37 | +loop_stmt = { |
| 38 | + "loop" ~ WHITESPACE* ~ ( expr ~ WHITESPACE* )? ~ block // loop { ... } lub loop 5 { ... } |
| 39 | + | "while" ~ WHITESPACE+ ~ expr ~ WHITESPACE* ~ block |
| 40 | + | "for" ~ WHITESPACE+ ~ ident ~ WHITESPACE+ ~ "in" ~ WHITESPACE+ ~ expr ~ WHITESPACE* ~ block // for x in range |
| 41 | +} |
| 42 | + |
| 43 | +fn_decl = { |
| 44 | + ( "fn" | "def" ) ~ WHITESPACE+ ~ ident ~ WHITESPACE* ~ "(" ~ param_list? ~ ")" ~ WHITESPACE* ~ block |
| 45 | +} |
| 46 | + |
| 47 | +param_list = { param ~ ( "," ~ WHITESPACE* ~ param )* } |
| 48 | + |
| 49 | +param = { ident ~ ( ":" ~ type_name )? } |
| 50 | + |
| 51 | +fn_call = { ident ~ WHITESPACE* ~ "(" ~ arg_list? ~ ")" ~ ";"? } |
| 52 | + |
| 53 | +arg_list = { expr ~ ( "," ~ WHITESPACE* ~ expr )* } |
| 54 | + |
| 55 | +command = { ">" ~ WHITESPACE* ~ (!"\n" ~ ANY)* ~ ("\n" | EOI) } // > echo "hello" |
| 56 | + |
| 57 | +block = _{ |
| 58 | + "{" ~ statement* ~ "}" |
| 59 | + | "then" ~ statement* ~ "end" ~ ( "if" | "" )? // Delphi/Ruby style |
| 60 | + | "do" ~ statement* ~ "end" // Ruby style |
| 61 | + | "begin" ~ statement* ~ "end" ~ ";"? // Delphi |
| 62 | +} |
| 63 | + |
| 64 | +expr = { logic_expr } |
| 65 | + |
| 66 | +logic_expr = { compare_expr ~ ( WHITESPACE* ~ ( "&&" | "||" | "and" | "or" ) ~ WHITESPACE* ~ compare_expr )* } |
| 67 | + |
| 68 | +compare_expr = { arith_expr ~ ( WHITESPACE* ~ ( "==" | "!=" | ">" | "<" | ">=" | "<=" ) ~ WHITESPACE* ~ arith_expr )* } |
| 69 | + |
| 70 | +arith_expr = { term ~ ( WHITESPACE* ~ ( "+" | "-" ) ~ WHITESPACE* ~ term )* } |
| 71 | + |
| 72 | +term = { factor ~ ( WHITESPACE* ~ ( "*" | "/" | "%" ) ~ WHITESPACE* ~ factor )* } |
| 73 | + |
| 74 | +factor = _{ |
| 75 | + "(" ~ expr ~ ")" |
| 76 | + | literal |
| 77 | + | ident |
| 78 | + | fn_call // Allow calls in expr |
| 79 | + | unary |
| 80 | +} |
| 81 | + |
| 82 | +unary = { ( "!" | "-" ) ~ factor } |
| 83 | + |
| 84 | +literal = _{ string | number | bool } |
| 85 | + |
| 86 | +string = @{ "\"" ~ ( [^ "\""] | "\\\"" )* ~ "\"" | "'" ~ ( [^ "'"] | "\\'" )* ~ "'" } |
| 87 | + |
| 88 | +number = @{ int | float } |
| 89 | + |
| 90 | +int = @{ "-"? ~ digit+ } |
| 91 | + |
| 92 | +float = @{ "-"? ~ digit* ~ "." ~ digit+ } |
| 93 | + |
| 94 | +bool = @{ "true" | "false" | "True" | "False" } |
| 95 | + |
| 96 | +digit = @{ "0".."9" } |
| 97 | + |
| 98 | +ident = @{ ascii_alpha ~ ( ascii_alpha | ascii_digit | "_" )* } |
| 99 | + |
| 100 | +ascii_alpha = @{ "a".."z" | "A".."Z" } |
| 101 | + |
| 102 | +ascii_digit = @{ "0".."9" } |
0 commit comments