#-------------- Symbol Sets -------------- space = " " tab = " " cr = " " sp = { space, tab, cr } letter = [abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_] digit = [0123456789] sym1 = [!@#$%^&*()+-=[\]{};':,.<>/?\\~`|] sym = { sym1, ["] } ascii1 = { letter, digit, sp, sym1 } ascii = { letter, digit, sp, sym } ascii2 = { letter, digit, space, tab, sym } #--------------- Names, numbers, strings, and comments -------------- syn_name = ( letter { digit, letter }* ) num = ([+-]? digit+ ("." digit*)? ("e" [+-]? digit+)?) syn_string = {ascii1, "\\\"", "\\\\"}* syn_stringq = ( ["] ["] ) syn_stringcr = ascii2* comment = ( "//" syn_stringcr cr ) spc = { sp, comment } #-------------- Built In Methods -------------------------- syn_path = ( syn_name ( "/" syn_name )* ) syn_getsrcL= syn_getsrcR= syn_getM = ( { ("$<"), ("$&<") }"//"">" ) syn_tmpname = ( "$$" ) syn_macparams = { ("$&" ), ("$&<" ">" ), ("$" ), ("$<" ">" ), ("$?" ), ("$?<" ">" ), ("$$" ), #, } syn_import = ( "import" spc* ["] ["]) syn_macro = ( "macro" spc+ { , syn_macparams } spc+ ) # Defun isn't really a built-in, but is semantically similar to syn_macro: syn_builtins = { , , } # syn_node needs to be available deeper in the syntax. syn_node2 = { , ( { syn_macparams, ( "%{" spc* spc* "}" ) } {space, tab}* cr ) } syn_node_name = { , syn_macparams } syn_nodesval= (spc* syn_node2)+ syn_node = ( syn_node_name {space, tab}* { ("{" spc* "}"), ("%{" spc* spc* "}"), ("=" ) } cr ) syn_nodes = ( "%{" (spc* syn_node2)+ spc* "}" ) syn_expand = ( "%(" ")" ) #-------------- Expressions ------------------- # Built-in methods: syn_nil2 = "%syn_nil" syn_nil = syn_cos = ("%cos" spc* "(" spc* spc* ")" ) syn_sin = ("%sin" spc* "(" spc* spc* ")" ) syn_exp = ("%exp" spc* "(" spc* spc* ")" ) syn_log = ("%log" spc* "(" spc* spc* ")" ) syn_strlen = ("%strlen" spc* "(" spc* spc* ")" ) syn_strsym = ("%strsym" spc* "(" spc* spc* "," spc* spc* ")" ) syn_strcat = ("%strcat" spc* "(" spc* spc* "," spc* spc* ")" ) syn_symstr = ("%symstr" spc* "(" spc* spc* ")" ) syn_isatom = ("%isatom" spc* "(" spc* spc* ")" ) syn_ismacro= ("%ismacro" spc* "(" spc* spc* ")" ) syn_tostring =("%string" spc* "(" spc* spc* ")" ) syn_print = { ("%print" spc* "(" spc* spc* ")" ), ("%print" spc* ["] ["] ) } syn_funcs = { , , , , , , , , , , , , , } syn_exprs= { ("{" ( spc* spc* ";")* spc* "}"), ("(" spc* spc* ")") } syn_var = syn_varset = {, , syn_stringq, syn_exprs, , , , , syn_nodes, syn_funcs, syn_macparams } syn_mulset = {,,,syn_varset} syn_addset = {,,,syn_mulset} syn_relset = {,,,,,,syn_addset} syn_logicset = {} syn_eqset = {,,,,,, , syn_builtins } syn_LeftLogic = { syn_logicset } syn_RightLogic = { syn_relset, syn_eqset } syn_LeftRel = { syn_relset } syn_RightRel = { syn_addset, syn_eqset } syn_LeftAdd = { syn_addset } syn_RightAdd = { syn_mulset, syn_eqset } syn_LeftMul = { syn_mulset } syn_RightMul = { syn_varset, syn_eqset } syn_LeftAsn = { , , syn_exprs, , } syn_RightAsn = { syn_relset, syn_eqset } syn_expr = { syn_RightAsn } syn_expr_list= ( (spc* "," spc* { , ( ":" spc* ) } )? ) syn_funcall = ( spc* "(" spc* { ( spc* ), ( ":" spc* ) }? ")" ) syn_methcall = ( spc* "." spc* syn_funcall) syn_name_list= ( (spc* "," spc* )?) syn_proto = ( spc* "(" spc* ( spc* )? ")" ) syn_defun = ( "defun" spc+ spc+ ) syn_get = ( spc* { ( "[" spc* spc* "]" ), ( "'s" spc+ ) }) syn_fieldset = ({ , ( "%@" spc* ) } spc* ":" spc* ) syn_set = ( spc* "=" spc* ) syn_add = ( spc* "+" spc* ) syn_sub = ( spc* "-" spc* ) syn_or = ( spc* "|" spc* ) syn_mul = ( spc* "*" spc* ) syn_div = ( spc* "/" spc* ) syn_and = ( spc* "&" spc* ) syn_xor = ( spc* "^" spc* ) syn_lt = ( spc* "<" spc* ) syn_gt = ( spc* ">" spc* ) syn_le = ( spc* "<=" spc* ) syn_ge = ( spc* ">=" spc* ) syn_eq = ( spc* "==" spc* ) syn_neq = ( spc* "!=" spc* ) syn_lnot = ("!" spc* ) syn_bnot = ("~" spc* ) syn_quote = ("'" spc* syn_expr) syn_eval = ("@" spc* syn_expr) # Not a build-in -- free to macro into whatever you want: syn_test = ("%test" spc* "(" spc* syn_expr spc* ")" ) syn_if = ("if" spc* spc* "then" spc* (spc* "else" spc* )? ) #--------------- File ------------------ file = ((spc* { (syn_expr spc* ";") } )* spc*)