Permalink
Cannot retrieve contributors at this time
Join GitHub today
GitHub is home to over 40 million developers working together to host and review code, manage projects, and build software together.
Sign up
Fetching contributors…
| _seps: "(){}[],.:;=<>*·+-/%^?~|&∧∨!¬∑∃∀\n\"\\" | |
| 200 multi_line_comment = ["/*" ..."*/"? .r?({ | |
| [!"*/" "*" ..."*/"?] [multi_line_comment ..."*/"?] ["/" ..."*/"?] | |
| }) "*/"] | |
| 201 comment = {multi_line_comment ["//" ..."\n"?]} | |
| 202 w = .r!({.w! comment}) | |
| 0 ns = ["ns" .w! .s!("::" .._seps!:"name")] | |
| 1 uses = .l({[.w? use:"use"] comment}) | |
| 2 use = ["use" .w! .s!(["::" !"{"] .._seps!:"name") | |
| ?["::" .w? "{" .w? .s?.(, | |
| [.._seps!:"use_fn" ?[.w! "as" .w! .._seps!:"use_fn_alias"]] | |
| ) .w? "}"] | |
| .w! "as" .w! .._seps!:"alias"] | |
| 3 fn = { | |
| ["fn" .w! .."("!:"name" ?w "(" ?w args ?w ")" ?w ?currents ?w { | |
| ["->":"returns" ?w ?type:"ret_type"] | |
| !"->":!"returns" | |
| } ?w block:"block"] | |
| [.."("!:"name" ?w "(" ?w args ?w ")" ?w ?currents ?w "=" ?w expr:"expr"] | |
| } | |
| 4 args = .s?.(, arg:"arg") | |
| 5 arg = [?"mut":"mut" ?w .._seps!:"name" ?[?w ":" ?w | |
| ?["'" ?w .._seps!:"lifetime"] ?w ?type:"type"]] | |
| 6 imm_arg = [!"mut " .._seps!:"name" ?[?w ":" ?w !"'" ?type:"type"]] | |
| 7 closure = ["\\(" ?w .s?.(, imm_arg:"arg") ?w ")" ?w ?currents | |
| ?w "=" ?w expr:"expr"] | |
| 8 call_closure = ["\\" item:"item" ?w "(" .s?.(, arg_expr:"call_arg") ?w ")"] | |
| 9 named_call_closure = ["\\" item:"item" ?w "(" ?w | |
| .s?.(, [.._seps!:"word" ?w ":" ?w arg_expr:"call_arg" ?w]) ")"] | |
| 10 currents = ["~" ?w .s!.(, current:"current")] | |
| 11 current = [?"mut":"mut" ?w .._seps!:"name" ?[?w ":" ?w type:"type"]] | |
| // Support both multi-line expressions and single line. | |
| 12 block = ["{" ?w {.l([?w expr:"expr" ?w]) [?w expr:"expr"]} ?w "}"] | |
| 13 expr = [{ | |
| in:"in" | |
| closure:"closure" | |
| object:"object" | |
| arr | |
| for_in:"for_in" | |
| for_n:"for_n" | |
| for:"for" | |
| loop:"loop" | |
| if:"if" | |
| break:"break" | |
| continue:"continue" | |
| block:"block" | |
| assign:"assign" | |
| compare:"compare" | |
| ["return" wn expr:"return"] | |
| ["return":"return_void"] | |
| add:"add" | |
| in_loops | |
| short_loops | |
| items | |
| } try] | |
| // Interprets "return" as variable, does not expect loops or assignment. | |
| 14 arg_expr = { | |
| ["mut":"mut" ?w item:"item"] | |
| swizzle:"swizzle" | |
| [{ | |
| in:"in" | |
| closure:"closure" | |
| object:"object" | |
| arr | |
| if:"if" | |
| block:"block" | |
| compare:"compare" | |
| add:"add" | |
| in_loops | |
| short_loops | |
| items | |
| } try] | |
| } | |
| 15 lexpr = [{ | |
| closure:"closure" | |
| object:"object" | |
| arr | |
| in_loops | |
| short_loops | |
| block:"block" | |
| items | |
| } try] | |
| 16 object = ["{" ?w .s?.(, key_value:"key_value") ?w "}"] | |
| 17 array = ["[" ?w .s?.(, expr:"array_item") ?w "]"] | |
| 18 array_fill = ["[" ?w expr:"fill" ?w ";" ?w expr:"n" ?w "]"] | |
| 19 key_value = [{.t?:"key" .._seps!:"key"} ?w ":" ?w expr:"val"] | |
| 20 num = .$_:"num" | |
| 21 vec4 = ["(" ?w arg_expr:"x" , ?arg_expr:"y" | |
| ?[, arg_expr:"z" ?[, arg_expr:"w"]] ?, ?w ")"] | |
| 22 color = ["#" .._seps!:"color"] | |
| 23 mat4 = ["mat4" .w! "{" ?w mat4_item:"ex" ?w ";" ?w ?mat4_item:"ey" | |
| ?[?w ";" ?w mat4_item:"ez" ?[?w ";" ?w ?w mat4_item:"ew"]] ?[?w ";"] ?w "}"] | |
| 24 mat4_item = {mat4_row:"vec4" arg_expr} | |
| 25 mat4_row = [arg_expr:"x" , ?arg_expr:"y" | |
| ?[, arg_expr:"z" ?[, arg_expr:"w"]] ?,] | |
| 26 text = .t?:"text" | |
| 27 bool = [{"true":"bool" "false":!"bool"} !.._seps!] | |
| 28 unop_not = [{"!":"!" "¬":"!"} ?w lexpr:"expr"] | |
| 29 unop_neg = ["-":"-" ?w mul_expr:"expr"] | |
| 30 norm = ["|" ?w expr:"expr" ?w "|"] | |
| 31 item = [?"~":"current" ?w .._seps!:"name" ?[wn "?":"try_item"] | |
| ?item_extra:"item_extra"] | |
| 32 item_extra = .r!([{ | |
| [wn "[" ?w {.t?:"id" .$_:"id" expr:"id"} ?w "]"] | |
| [?w "." ?w .._seps!:"id"] | |
| } ?[wn "?":"try_id"]]) | |
| 33 link = ["link" ?w "{" ?w link_body "}"] | |
| 34 link_body = .s?.(?w expr:"link_item") | |
| // Generate link block for body. | |
| 35 link_for = [label "link" .w! .s!.(, [.._seps!:"name" ?w | |
| ?{ | |
| ["[" ?w expr:"start" , expr:"end" ?w ")"] | |
| [!"{" expr:"end"] | |
| }]) ?w "{" ?w link_body_block:"block" "}"] | |
| 36 link_body_block = link_body_expr:"expr" | |
| 37 link_body_expr = link_body:"link" | |
| 38 for = [label "for" .w! | |
| expr:"init" ?w ";" ?w | |
| expr:"cond" ?w ";" ?w | |
| expr:"step" ?w block:"block"] | |
| 39 for_n = [label "for" short_body] | |
| 40 for_in = [label "for" in_body] | |
| 41 loop = [label "loop" .w! block:"block"] | |
| 42 break = ["break" !.._seps! wn ?["'" .._seps!:"label"]] | |
| 43 continue = ["continue" !.._seps! wn ?["'" .._seps!:"label"]] | |
| 44 if = ["if" .w! expr:"cond" ?w block:"true_block" | |
| .r?([?w "else" w "if" ?w expr:"else_if_cond" ?w block:"else_if_block"]) | |
| ?[?w "else" ?w block:"else_block"]] | |
| 45 call = [?[.._seps!:"alias" "::"] .._seps!:"name" wn "(" ?w | |
| .s?.(, arg_expr:"call_arg") ?w ")"] | |
| 46 named_call = [?[.._seps!:"alias" "::"] .._seps!:"word" wn "(" ?w | |
| .s?.(, [.._seps!:"word" ?w ":" ?w arg_expr:"call_arg" ?w]) ")"] | |
| 47 go = ["go " ?w {call:"call" named_call:"named_call"}] | |
| 48 assign = [lexpr:"left" wn assign_op ?w expr:"right"] | |
| 49 assign_op = { | |
| ":=":":=" "=":"=" "+=":"+=" "-=":"-=" "*=":"*=" "/=":"/=" "%=":"%=" "^=":"^=" | |
| } | |
| 50 compare = [lexpr:"left" wn compare_op ?w expr:"right"] | |
| 51 compare_op = {"==":"==" "!=":"!=" "¬=":"!=" "<=":"<=" "<":"<" ">=":">=" ">":">"} | |
| 52 grab = ["grab" ?[w "'" .$:"grab_level"] w expr:"expr"] | |
| 53 try_expr = ["try" w expr:"expr"] | |
| 54 in = ["in" w ?[.._seps!:"alias" "::"] .._seps!:"name"] | |
| 60 label = ?["'" .._seps!:"label" ?w ":" ?w] | |
| 61 short_body = [.w! .s!.(, [.._seps!:"name" ?w | |
| ?{ | |
| ["[" ?w expr:"start" , expr:"end" ?w ")"] | |
| [!"{" expr:"end"] | |
| }]) ?w block:"block"] | |
| 62 in_body = [.w! .._seps!:"name" .w! "in" .w! expr:"iter" ?w block:"block"] | |
| 63 try = ?[wn "?":"try"] | |
| 64 , = [?w "," ?w] | |
| 65 arr = {array:"array" array_fill:"array_fill"} | |
| 66 items = {mat4:"mat4" vec4:"vec4" link:"link" grab:"grab" try_expr:"try_expr" | |
| ["(" ?w expr ?w ")"] unop_not:"unop" norm:"norm" | |
| text go:"go" | |
| call_closure:"call_closure" named_call_closure:"named_call_closure" | |
| call:"call" named_call:"named_call" | |
| num bool color item:"item"} | |
| // Allow whitespace, but no new line. | |
| 67 wn = .r?({" " "\t" "\r"}) | |
| 70 in_loops = {sum_in:"sum_in" prod_in:"prod_in" | |
| min_in:"min_in" max_in:"max_in" any_in:"any_in" all_in:"all_in" | |
| sift_in:"sift_in" link_in:"link_in"} | |
| 71 sum_in = [label {"sum" "∑"} in_body] | |
| 72 prod_in = [label {"prod" "∏"} in_body] | |
| 73 min_in = [label "min" in_body] | |
| 74 max_in = [label "max" in_body] | |
| 75 any_in = [label {"any" "∃"} in_body] | |
| 76 all_in = [label {"all" "∀"} in_body] | |
| 77 sift_in = [label "sift" in_body] | |
| 78 link_in = [label "link" .w! .._seps!:"name" .w! "in" .w! expr:"iter" ?w | |
| "{" ?w link_body_block:"block" "}"] | |
| 80 short_loops = {sum:"sum" prod:"prod" sum_vec4:"sum_vec4" | |
| prod_vec4:"prod_vec4" min:"min" max:"max" sift:"sift" | |
| any:"any" all:"all" vec4_un_loop:"vec4_un_loop" link_for:"link_for"} | |
| 81 sum = [label {"sum" "∑"} short_body] | |
| 82 prod = [label {"prod" "∏"} short_body] | |
| 83 min = [label "min" short_body] | |
| 84 max = [label "max" short_body] | |
| 85 sift = [label "sift" short_body] | |
| 86 any = [label {"any" "∃"} short_body] | |
| 87 all = [label {"all" "∀"} short_body] | |
| 88 sum_vec4 = [label {"sum_vec4" "∑vec4"} short_body] | |
| 89 prod_vec4 = [label {"prod_vec4" "∏vec4"} short_body] | |
| 90 vec4_un_loop = ["vec" {"4":"4" "3":"3" "2":"2"} | |
| w .._seps!:"name" w expr:"expr"] | |
| 91 swizzle = [sw:"sw0" sw:"sw1" ?sw:"sw2" ?sw:"sw3" w expr:"expr"] | |
| 92 sw = {"x":"x" "y":"y" "z":"z" "w":"w"} | |
| 100 type = { | |
| "any":"any" | |
| "bool":"bool" | |
| "f64":"f64" | |
| "str":"str" | |
| "vec4":"vec4" | |
| "mat4":"mat4" | |
| "link":"link" | |
| ["opt" ?w "[" ?w type:"opt" ?w "]"] | |
| "opt":"opt_any" | |
| ["res" ?w "[" ?w type:"res" ?w "]"] | |
| "res":"res_any" | |
| ["sec" ?w "[" ?w {"bool":"sec_bool" "f64":"sec_f64"} ?w "]"] | |
| "[]":"arr_any" | |
| ["[" ?w type:"arr" ?w "]"] | |
| "{}":"obj_any" | |
| ["thr" ?w "[" ?w type:"thr" ?w "]"] | |
| "thr":"thr_any" | |
| ["in" ?w "[" ?w type:"in" ?w "]"] | |
| "in":"in_any" | |
| closure_type:"closure_type" | |
| [.._seps!:"ad_hoc" ?[?w type:"ad_hoc_ty"]] | |
| } | |
| 101 closure_type = ["\\(" ?w .s?.(, type:"cl_arg") ?w ")" | |
| ?w "->" ?w type:"cl_ret"] | |
| 200 + = [wn {"+":"+" "||":"||" "∨":"+" ["or":"+" w]} ?w] | |
| 201 - = [wn "-":"-" ?w] | |
| // Allow whitespace before multiplication sign, but no new line. | |
| // This prevents `x` on a new line from being interpreted as multiplication sign. | |
| 202 * = [wn { | |
| "*.":"*." "·":"*." | |
| ["x":"x" w] "⨯":"x" | |
| "*":"*" "&&":"&&" "∧":"*" ["and":"*" w] | |
| } ?w] | |
| 203 / = [wn "/":"/" !"/" ?w] | |
| 204 % = [wn "%":"%" ?w] | |
| 205 pow = [lexpr:"base" wn {"^" "⊻" ["xor" w]} ?w lexpr:"exp"] | |
| 206 mul = .s!({* / %} {unop_neg:"unop" pow:"pow" lexpr:"val"}) | |
| 207 mul_expr = {mul:"mul"} | |
| 208 add = .s!({+ -} mul_expr:"expr") | |
| 1000 document = [?ns:"ns" ?w ?uses:"uses" ?w .l({[.w? fn:"fn"] comment})] |