#-------------- Symbol Sets -------------- space = " " tab = " " cr = " " sp = { space, tab, cr } st = { space, tab } lcase = [abcdefghijklmnopqrstuvwxyz] ucase = [ABCDEFGHIJKLMNOPQRSTUVWXYZ] letter = { lcase, ucase, [_] } digit = [0123456789] sym4 = [!@#$^&*()+-=[\]{}':,.<>/?\\~`|] # All syms but ", %, and ; sym2 = { sym4, [;] } # All syms but " and % sym1 = { sym2, [%] } # All syms but " sym3 = { sym2, ["] } # All syms but % sym5 = { sym4, ["] } # All syms but ; and % sym = { sym1, ["] } # All syms ascii1 = { letter, digit, sp, sym1 } # Everything but " ascii = { letter, digit, sp, sym } # Everything ascii2 = { letter, digit, st, sym } # Everything but \n ascii3 = { letter, digit, st, sym3 } # Everthing but % and \n ascii4 = { letter, digit, sp, sym5 } # Everthing but % and ; #--------------- Names, numbers, strings, and comments -------------- syn_name = ( letter { digit, letter }* ) syn_num = ([+-]? digit+ ("." digit*)? ("e" [+-]? digit+)?) syn_string = {ascii1, "\\\"", "\\\\"}* syn_stringq = ( ["] ["] ) syn_stringq2 = ( ["] syn_string ["] ) comment = ( "//" ascii2* cr ) spc = { sp, comment } endline = ( { space, tab}* { comment, cr } ) #-------------- Syn built-in Methods -------------------------- syn_import = ( "import" spc* ["] ["] ) #----------------- Synsh ------------------------ # synsh_exprs are expressions which return a value. # shline's are... cryptic. shline_dst = ( "%[" "]" ) shline_var = ( "%(" ")" ) shline_tmp = ( "%<" ">" ) shline_escapes= [%;] shline_escape = ( "%" ) shline_str = ascii4* shline_item = { shline_str, , , shline_tmp, shline_escape } shline_body3 = ( ? ) shline_body2 = { shline_item, } shline_body = shline = ( { ( "src:" ), ( "dst:" ), ( "code:" ) } ";" ) # Here are the indivisible synsh_exprs: synsh_expr_closedSet = { , , , , , shline, , ( "%(" ")" ), ( "{" spc* spc* "}" ), ( "(" spc* spc* ")" ) } # Unary (or in effect so), open on the right: synsh_expr_rightSet = { , , , , } # Unary (or in effect so), open on the left: synsh_expr_leftSet = { , } # Here are all binary synsh_exprs (value-returning exprs), grouped in sets # from highest priority down to lowest: synsh_expr_mulSet = { ,
, , , } synsh_expr_addSet = { , , } synsh_expr_shfSet = { , , } synsh_expr_relSet = { , , , , , } synsh_expr_xorSet = { } synsh_expr_andSet = { } synsh_expr_lorSet = { } # Here is what is allowed in each context: synsh_expr_LeftMul = { synsh_expr_mulSet, synsh_expr_closedSet, synsh_expr_leftSet } synsh_expr_LeftAdd = { synsh_expr_addSet, synsh_expr_LeftMul } synsh_expr_LeftShf = { synsh_expr_shfSet, synsh_expr_LeftAdd } synsh_expr_LeftRel = { synsh_expr_relSet, synsh_expr_LeftShf } synsh_expr_LeftXor = { synsh_expr_xorSet, synsh_expr_LeftRel, } synsh_expr_LeftAnd = { synsh_expr_andSet, synsh_expr_LeftXor } synsh_expr_LeftLor = { synsh_expr_lorSet, synsh_expr_LeftAnd } synsh_expr_RightMul = { synsh_expr_closedSet, synsh_expr_rightSet, , } synsh_expr_RightAdd = { synsh_expr_mulSet, synsh_expr_RightMul } synsh_expr_RightShf = { synsh_expr_addSet, synsh_expr_RightAdd } synsh_expr_RightRel = { synsh_expr_shfSet, synsh_expr_RightShf } synsh_expr_RightXor = { synsh_expr_relSet, synsh_expr_RightRel } synsh_expr_RightAnd = { synsh_expr_xorSet, synsh_expr_RightXor } synsh_expr_RightLor = { synsh_expr_andSet, synsh_expr_RightAnd } synsh_expr_RightNot = synsh_expr_RightXor synsh_expr_LeftIndex = { synsh_expr_closedSet, synsh_expr_leftSet } synsh_expr_LeftField = { synsh_expr_closedSet, synsh_expr_leftSet } synsh_expr_LeftAsn = { synsh_expr_closedSet, synsh_expr_leftSet } synsh_expr = { synsh_expr_lorSet, synsh_expr_RightLor } mul = ( spc* "*" spc* ) div = ( spc* "/" spc* ) rem = ( spc* "%" spc* ) xor = ( spc* "^" spc* ) and = ( spc* "&" spc* ) add = ( spc* "+" spc* ) sub = ( spc* "-" spc* ) or = ( spc* "|" spc* ) shl = ( spc* "<<" spc* ) srs = ( spc* "->>" spc* ) sru = ( spc* "+>>" spc* ) lt = ( spc* "<" spc* ) gt = ( spc* ">" spc* ) le = ( spc* "<=" spc* ) ge = ( spc* ">=" spc* ) eq = ( spc* "==" spc* ) neq = ( spc* "!=" spc* ) lor = ( spc* "||" spc* ) land = ( spc* "&&" spc* ) lxor = ( spc* "^^" spc* ) field = ( spc* "'s" spc+ ) lnot = ( "!" spc* ) index = ( st* "[" spc* spc* "]" ) if = ( "if" spc+ spc+ "then" spc+ (spc* "else" spc* )? ) while = ( "while" spc+ spc+ "do" spc+ ) for = ( "for" spc* "(" spc* spc* ";" spc* spc* ";" spc* spc* ")" spc* ) synsh_var = synsh_var2 = synsh_intval = #synsh_strval = ( ["] ["] ) synsh_strval = ( ) synsh_type = # Later may include more complex type definitions. literal = ( "'" ) assign = ( spc* "=" spc* ) params = ( ( spc* "," spc* )? ) synsh_funcall = ( st* "(" spc* ( spc*)? ")" ) synsh_proto_param = ( spc+ ) synsh_proto_params = ( ( spc* "," spc* )? ) synsh_proto = ( spc+ spc* "(" spc* ( spc*)? ")" ) synsh_var_decl = ( spc+ ) synsh_macro = ( "macro" spc+ spc* spc* ";") synsh_synmac = ( "synmac" spc+ spc+ spc* ";" ) synsh_exprs = ( spc* ";" (spc* )? ) #--------------- Top Level items such as defining methods, importing, etc. ------------ #synsh_codeblock = ( "{" spc* spc* "}" spc* ";" ) synsh_define = ( "define" spc+ spc* spc* ";") synsh_block = { , , } topLevelItem = { , } #--------------- File ------------------ file = (spc* (topLevelItem spc*)*)