2016-06-24 4 views
0

Вот грамматика, которую я использовал. Действие после согласования правила «Func» вызывается 12 раз для входной строки, если (diff («col»)) вместо 2 раз.Грамматика соответствует правилу функции больше необходимого количества раз

Отладка Я понял, что переменная привязки $ currPos возвращается при анализе правила Eq. Я не могу понять, точное поведение

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]*    

ответ

0

Причина вы столкнулись это потому, что Func правило подобрано, что во много раз. К сожалению, некоторые из этих совпадений являются частью более крупных выражений (в правиле Eq), которые терпят неудачу. Вот почему вы видите peg$currPos.

Может попробовать:

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

Да я понял. спасибо –