Here is a grammar that I used. The action after matching the rule 'Func' is called 12 times for the input string if(diff("col")) instead of 2 times.
Debugging I realised the varible peg$currPos is being set back when parsing the Eq rule. I am not able to understand the exact behaviour
Main = Eq
Eq = (Ar (('equal'i/'>='/'<='/'<>'/'!='/'<'/'>'/'=') Ar))
/Ar ('equal'i/'>='/'<='/'<>'/'!='/'<'/'>'/'=')
/Ar
Ar = (Mul (('+'/'-') Mul )*) ('+'/'-')?
Mul = (Ex (('*'/'/'/'%'/'^') Ex )*) ('*'/'/'/'%'/'^')?
Ex = __ ('-'__ Main/'(' __ Main __ ')'/Func/Lit) __ /'-'
Func = __ id (('('__ Main __')')/'('__')') __ {
console.log(text());
}
Lit = (col/charLit/numLit)
/ id:id
charLit "character" = string:$("'"[^']*"'")
numLit "number" = $([0-9.]+)
col "column" = col:$('"'[^"]*'"')
id "identifier" = $([a-zA-Z][a-zA-Z0-9_]*)
__ "space" = [ \t\n]*