diff --git a/peg.txt b/peg.txt new file mode 100644 index 0000000..b42f97f --- /dev/null +++ b/peg.txt @@ -0,0 +1,49 @@ +program := __* stmt* + +stmt := assignment / + funcall stop / + conditional / + expr stop + +expr := - _ expr / + expr "+" _ expr / + expr "-" - expr / + expr "*" _ expr / + expr "/" _ expr / + "(" _ expr ")" / + ['"'] ((!['"'] [_] / #"\""#)*) ['"'] / + funcall / + fundef / + boolean / + id / + num + +boolean := ("true" / "false") _ +id := letter (letter / digit / ['?'|'.'|'-'])* _ +num := (digit+ "."? digit* / "." digit+) _ + +assignment := id "<-" _ expr stop +funcall := id "(" _ expr ** ("," _) ")" _ +funcdef := id? "->" _ block + +conditional := if __* elif* __* else? __* +if := "if" _ expr block +elif := "elif" _ expr block +else := "else" _ block + +block := expr / indented_block +indented_block := stop indent __* stmt+ dedent + +letter := ['A'..='Z'] / ['a'..='z'] +digit := ['0'..='9'] + +stop := __+ / eof +indent := ">>>" +dedent := "<<<" + +_ := ['\t'|' ']* +__ := comment? newline / comment &eof +comment := "#" (!newline [_])* &(newline / eof) +newline := "\r\n" \ "\r" \ "\n" + +eof := ![_]