skipper = \b([ \t\n\r]+|#.*)* int = [0-9]+ end = ([ \t]+|#.*)*\r*\n name = [A-Za-z][A-Za-z0-9]* uname = [A-Za-z][A-Za-z0-9_]* lower_index = ({index_symbol}|\({index_expr}(,{index_expr})*\)) upper_index = ({index_symbol}|\({index_expr}(,{index_expr})*\)) indices = (\_{lower_index}+|\^{upper_index}+)* index_symbol = [a-zA-Z]'*|[0-9] index_op = [+-] index_expr = {index_symbol}({index_op}{int}|) tensor = {name}{indices} dname = D[a-z0-9]* rawmath = @\{[^}]*\} dtensor = {rawmath}|({dname}{indices})? {tensor} number = -?[0-9]+(\.[0-9]*|)([eEdD][+-]?[0-9]+|) func = {name} \( ({expr}( , {expr})*|) \) value = {func}|{dtensor}|-?{tensor}|{number}|-?\( {expr} \) pow = {value}( \*\* {value}|) mulop = [*/%] mul = {pow}( {mulop} {pow})* addop = [+-] mexpr = {mul}( {addop} {mul})* expr = {mexpr}( \? {mexpr} : {mexpr})? eqn = ({dtensor}|{tensor}) \= {expr}{-end} deqn = {dtensor} \= {expr}{-end} eqns = {eqn}( {eqn})* deqns = {deqn}( {deqn})* at_or_in = (at|in) schedule = scheduled[ \t]+{at_or_in}[ \t]{uname} calculation = begin[ \t]+calculation[ \t]+{uname}([ \t]+{schedule}|){-end} {eqns} end[ \t]+calculation variables = begin[ \t]+variables{-end} ( end[ \t]+variables\b{brk}| {tensor})*{-end} temporaries = begin[ \t]+temporaries{-end} ( end[ \t]+temporaries\b{brk}| {tensor})*{-end} option = {inherit}|{use}|{disable}|{implement} inherit = inherit[ \t]+({uname}[ \t]*)+{-end} feature = loopcontrol|vectors|opencl|jacobian|cse|cakernel use = use[ \t]+({feature}[ \t]*)+ disable = disable[ \t]+({feature}[ \t]*)+ implement = implement[ \t]+{uname}{-end} derivatives = begin[ \t]+derivatives{-end} {deqns} end[ \t]+derivatives thorn = {-skipper}begin[ ]+thorn {uname}{-end}( {calculation}| {variables}| {temporaries}| {derivatives}| {option})* end[ ]+thorn