语法匹配函数规则超过所需次数

时间:2016-06-24 08:09:36

标签: javascript pegjs

这是我使用的语法。匹配规则后的操作' Func'如果(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]*              

1 个答案:

答案 0 :(得分:0)

您遇到此问题的原因是Func规则多次匹配。不幸的是,其中一些匹配是失败的较大表达式(在Eq规则中)的一部分。这就是为什么你看到peg$currPos被撤回的原因。

也许试试:

Eq = Ar (('equal'i/'>='/'<='/'<>'/'!='/'<'/'>'/'=') Ar?)?