这是我使用的语法。匹配规则“ Func”后的操作将为输入字符串if(diff(“ col”))调用12次,而不是2次。
调试时,我意识到解析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]*
您遇到此问题的原因是因为该Func
规则已匹配多次。不幸的是,其中一些匹配项是Eq
失败的较大表达式(按规则)的一部分。这就是为什么您看到peg$currPos
被挫折的原因。
也许尝试:
Eq = Ar (('equal'i/'>='/'<='/'<>'/'!='/'<'/'>'/'=') Ar?)?
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加