BLUE
####
####
####
expression : subexpression /^\$/ { \$return = \$item[1]; }
subexpression : binary_op { \$item[1] }
| function_call { \$item[1] }
| var { \$item[1] }
| literal { \$item[1] }
| '(' subexpression ')' { \$item[2] }
|
binary_op : '(' subexpression op subexpression ')'
{ [ \$item[3][0], \$item[3][1], \$item[2], \$item[4] ] }
op : />=?|<=?|!=|==/ { [ ${\BIN_OP}, \$item[1] ] }
| /le|ge|eq|ne|lt|gt/ { [ ${\BIN_OP}, \$item[1] ] }
| /\\|\\||or|&&|and/ { [ ${\BIN_OP}, \$item[1] ] }
| /[-+*\\/\%]/ { [ ${\BIN_OP}, \$item[1] ] }
function_call : function_name '(' args ')'
{ [ ${\FUNCTION_CALL}, \$item[1], \$item[3] ] }
| function_name ...'(' subexpression
{ [ ${\FUNCTION_CALL}, \$item[1], [ \$item[3] ] ] }
| function_name '(' ')'
{ [ ${\FUNCTION_CALL}, \$item[1] ] }
function_name : /[A-Za-z_][A-Za-z0-9_]*/
{ \$item[1] }
args :
var : /[A-Za-z_][A-Za-z0-9_]*/ { \\\$item[1] }
literal : /-?\\d*\\.\\d+/ { \$item[1] }
| /-?\\d+/ { \$item[1] }
| { \$item[1][2] }