Package Hi; /*\end{verbatim} \subsection{Helpers} Helpers are regular expressions macros used in the definition of terminal symbols of the grammar. \begin{verbatim}*/ Helpers letter = [['A'..'Z']+['a'..'z']]; digit = ['0'..'9']; alphanum = [letter+['0'..'9']]; cr = 13; lf = 10; tab = 9; digit_sequence = digit+; letseq = letter+; opsym = '+'|'-'|'='|'\'|'.'|'!'|'#'|'&'|'@'|'*'|'~'|'|'|'%'|'_'|'?'|'<'|'>'|'/'; opseq = opsym+; eol = cr lf |cr |lf; // This takes care of different platforms not_cr_lf = [[32..127] - [cr + lf]]; quote = '''; all =[0..127]; schar = [all-''']; not_star = [all - '*']; not_star_slash = [not_star - '/']; Tokens arrow= '->'; bra= '['; comma= ','; def='def' ; dot='.'; else= 'else'; external= 'external'; fi= 'fi'; if= 'if'; inline= 'inline'; ket= ']'; lparen = '('; number= digit_sequence; rparen = ')'; scalar= 'scalar'; semi= ';'; then= 'then'; vec= 'vec'; /* composite tokens */ id = letseq; op=opseq; comment = '/*' not_star* '*'+ (not_star_slash not_star* '*'+)* '/'; string = quote schar+ quote; blank = (' '|cr|lf|tab)+; Ignored Tokens blank,comment; Productions program = fndecl + ; actuallist = expr comma; actualparams= {emptyparams}| {paramlist} actuallist* expr; atom = {literal} literal| {paramname} id| {comp}comp; body = {expression}expr semi| {external} external semi| {inline} inline string semi; comp = {vector} vectorcon | {if} conval | {bracketed} lparen expr rparen; cond = expr; conval = if cond then true else false fi; expcomma = expr comma; expr = {opexpr} opexpr | {secondary}secondary ; false = expr; fndecl = id lparen params arrow type rparen body |{opdec} op lparen opparam arrow type rparen body; literal = {string} string| {scalar} number; map = id lparen actualparams rparen; opexpr = primary op expr ; opparam = [l]: param comma [r]:param|{monop} param; param = type id; paramlist = param comma; params = {emptyparams} | {paramlist}paramlist* param; primary = {map} map|atom; secondary = {primary}primary| {monad} op atom; true = expr; type = {scalar} scalar| {vector} vec number ; vectorcon = bra actualparams ket ;