feng/grammar/grammar.peg
2026-02-21 00:51:37 +01:00

119 lines
2.4 KiB
Text

# vim:fileencoding=utf-8:foldmethod=marker
Program <- skip (Function _endline*)+ eof
# *** variable definition *** {{{
Variable <- IDENTIFIER Definition
/ return_keyword " is " value
Definition <- " is " (value / "a " type)
value <- IDENTIFIER
/ number
type <- "number"
# }}}
fn_keyword <- "how-to"
argouments_keyword <- "requires"
return_keyword <- "resoult"
function_keywords <- fn_keyword / argouments_keyword / return_keyword
Function <-
fn_keyword " " IDENTIFIER ":" newline
Requires endline
Resoult endline
(Step endline)+
Requires <- argouments_keyword " " Argouments
Argouments <- "nothing"
/ "a " type " " IDENTIFIER (" and a " type " " IDENTIFIER)*
Resoult <- return_keyword " is " ("nothing" / "a " type)
Fn_call <- IDENTIFIER " " (value (" and " value)*)? (steps_keyword " " number"-"number (" and " number"-"number)*)?
if_keyword <- "if"
If_call <- if_keyword " " value ((" and " value)* " are " / " is ") operation " " (Fn_call / Variable)
operation <- "equal"
/ "different"
/ "true"
/ "false"
if_keywords <- if_keyword / operation
repeat_keyword <- "repeat"
step_keyword <- "step" # single step
steps_keyword <- "steps" # multiple steps
relative_keyword <- "from" # from x step to the end/current positionx
relative_position <- "the start"
relative_numbering_keyword <- "steps ago"
relative_numbering <- number " " relative_numbering_keyword
Repeat_call <- repeat_keyword " " (
step_keyword " " number
/ steps_keyword " " number"-"number ("and" number"-"number)*
/ relative_keyword " " (
relative_position
/ relative_numbering
/ step_keyword " " number
)
) (" with " value (" and " value)*)?
repeat_call_keywords <- repeat_keyword
/ step_keyword
/ steps_keyword
/ relative_keyword
/ relative_position
/ relative_numbering_keyword
Step <- number") "
(Variable
/ If_call
/ Repeat_call
/ Fn_call) endline
IDENTIFIER <- !keyword [A-Za-z] [A-Za-z0-9_]*
generic_keywords <- "a "
/ "is "
/ "and "
/ "nothing "
keyword <- function_keywords / if_keywords / repeat_call_keywords / generic_keywords
comment <- "//" (!newline .)* newline
# *** Nicities *** {{{
skip <- ([ \n] / comment)*
endline <- &. " "* comment? "\n"?
_endline <- &. " "* comment? "\n"
eof <- !.
newline <- "\n"
number <- binary
/ hex
/ dec
binary <- "0b" [01]+
hex <- "0x" [0-9A-Fa-f]+
dec <- [0-9]+
# }}}