Skip to content

Commit da49b0b

Browse files
authored
Create not-scripting.pest
1 parent b67e931 commit da49b0b

File tree

1 file changed

+102
-0
lines changed

1 file changed

+102
-0
lines changed

not-scripting.pest

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
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

Comments
 (0)