0

これが私が使った文法です。ルール「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]*              
4

1 に答える 1

0

これが発生する理由は、Funcルールが何度も一致するためです。残念ながら、これらの一致の一部は (Eqルール内の) 失敗するより大きな式の一部です。peg$currPosそれが後退しているのを見る理由です。

多分試してください:

Eq = Ar (('equal'i/'>='/'<='/'<>'/'!='/'<'/'>'/'=') Ar?)?
于 2016-07-14T22:18:34.920 に答える