これが私が使った文法です。ルール「Func」に一致した後のアクションは、入力文字列 if(diff("col")) に対して 2 回ではなく 12 回呼び出されます。
デバッグ Eq ルールを解析しているときに、変数 peg$currPos が元に戻されていることに気付きました。正確な動作を理解できません
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]*