语法匹配函数规则的次数超过要求的次数
Grammar is matching function rule more than required number of times
这是我用过的语法。匹配规则 '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?)?
这是我用过的语法。匹配规则 '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?)?