Browse Source

Work on using a PEG parser for raku.

Beoran 6 years ago
parent
commit
e324aaebaf
1 changed files with 75 additions and 0 deletions
  1. 75 0
      raku/raku.peg

+ 75 - 0
raku/raku.peg

@@ -0,0 +1,75 @@
+    PROGRAM      ←  STATEMENTS
+    STATEMENTS   ←  ((COMMAND COMMENT? / COMMENT) EOX)+
+    ~COMMENT     ←  ("#" / "comment" / "remark" / "rem") (!([\r\n]+).)*
+    COMMAND      ←  WORD (ARGUMENTS)?
+    EKEYWORD     ← "calculate" / "calc" / "expression" / "expr"
+    PKEYWORD     ← "evaluate" / "eval" / "perform"
+    XKEYWORD     ← "do" /  "end"
+    BLOCK        ←  "do" EOX? STATEMENTS? "end" / "{" EOX? STATEMENTS? "}"
+    PBLOCK       ←  PKEYWORD EOX? STATEMENTS? "end" / "[" EOX? STATEMENTS? "]"
+    
+    ARGUMENTS    ←  (ARGSEP? (BLOCK / PBLOCK / ARGUMENT))*
+    # ARGUMENTS    ←  PREPOSITION* ARTICLE* ARGUMENT ((ARGSEP? BLOCK) /
+    #                    (ARGSEP? PBLOCK) / (ARGSEP? ARGUMENT))*
+    ARGSEP       ←  ',' / ((PREPOSITION / ARTICLE)+) 
+    PREPOSITION  ←  < ( "else"    / "otherwise"   /
+     "aboard"   / "about"       / "above"   / "across"      / "after" / "against" / 
+     "alongside"/ "along"       / "amidst"  / "amidst"      / "among" / "around"  /
+     "as"       / "at"          / "atop"    /  "before"     / "behind"/ "below"   /
+     "beneath"  / "besides"     / "beside"  / "between"     / "beyond"/ "but"     /  
+     "by"       / "circa"       / "despite" / "down"        / "during"/ "except"  /
+     "for"      / "from"        / "inside"  / "into"        / "in"    / "less"    /
+     "like"     / "near"        / "nothwithstanding"        / "off"   / "onto"    /
+     "on"       / "opposite"    / "outside" / "out"         / "over"  / "since"   /
+     "than"     / "through"     / "thru"    / "towards"     / "throughout" / "to" /
+     "underneath"/ "under"      / "unlike"  / "until"       / "upon"       / "upside" /
+     "up"       / "versus"      / "via"     / "within"      / "without"    / "with" ) > WHITESPACE
+    ~ARTICLE     ←  <("a" / "an" / "the")> WHITESPACE
+    ARGUMENT     ← EXPR
+    # / NUMBER
+    EXPR         ←  BINEXPR / UNEXPR
+    BINEXPR      ← (ATOM (BINOP ATOM)*)
+    UNEXPR       ←  (UNOP ATOM) 
+    ATOM         ←  STRING / NAME / NUMBER / '(' EXPR ')' / EKEYWORD EXPR "end"
+    KWUNOP       ← "not" / "negate"
+    KWBINOP      ← "plus" / "minus" / "times" / "divide" /  "of" / "'s" / "'" / "and" / "or" / "equals" / "equal" / "is"
+    BINOP        ←  < [-+/*] / "<-" / "->"  "&&"/ "||" / "==" / KWBINOP > 
+    UNOP         ←  < [-!] / KWUNOP >   
+    # / "of" / "'s"
+    STRING       ← ESCSTR / RAWSTR
+    # Raw string macro
+    RAWSM(O,C)   ← O < (!(C).)* > C
+    NAME         ← ARTICLE? WORD+ 
+    # Escaped string macro.
+    ESCSM(O,C)   ← O < (!(C)STRCHAR)* > C
+    ESCSTR       ← ESCSM("`", "`") / ESCSM('"', '"')
+    RAWSTR       ← RAWSM('<<', '>>') /  RAWSM('«', '»') / RAWSM('‹', '›') / RAWSM('“', '”')
+    STRESC1      ← "\\" [nrtfv\'\\"\[\]\\]
+    STRESC2      ← "\\" [0-3] [0-7] [0-7]
+    STRESC3      ← "\\" [0-7] [0-7]*
+    STRESC4      ← "\\x" [0-9a-fA-F] [0-9a-fA-F]?
+    STRESC5      ← "\\u" [0-9a-fA-F]+
+    STRNOESC     ← (!('\\\\').)
+    STRCHAR      ←   STRESC1 / STRESC2 / STRESC3 / STRESC4 / STRESC5 / STRNOESC    
+    NUMBER       ←  DECIMAL / INTEGER
+    DECIMAL      ← < [-]?[0-9]+[.][0-9]+ >
+    INTEGER      ← < [-]?[0-9]+ >
+    ~EOX         ← ([ \t]*[\r\n.]+[ \t]*)+
+    KEYWORD      ← PREPOSITION / ARTICLE / XKEYWORD / EKEYWORD / KWBINOP / KWUNOP
+    WORD         ← !KEYWORD ANYWORD
+    ANYWORD      ← < [a-zA-Z][a-zA-Z0-9]* >
+    WHITESPACE   ← < [ \t]* >
+    %whitespace  ←  [ \t]*
+    %word        ← [a-zA-Z][-+/*a-zA-Z0-9]*
+    ---
+    # Expression parsing option
+    %expr  = BINEXPR   # Rule to apply 'precedence climbing method' to
+    %binop = L && || and or  
+    %binop = L == equals equal is 
+    %binop = L + - plus minus  
+    %binop = L * / times divide
+    %binop = L of 's <- -> ' 
+    
+    
+    # foo bar baz quux
+