2013-09-09 4 views
2

Этот код грамматики автономный правило дает ожидаемый результатКак правила духовного процесса?

term  = (double_ >> "+" >> term) [_val = _1 + _2]| 
       (double_ >> "-" >> term) [_val = _1 - _2]| 
       (double_ >> "*" >> term) [_val = _1 * _2]| 
       (double_ >> "/" >> term) [_val = _1/_2]| 
       double_     [_val = _1] ; 

в то время как это один не делает:

term  = (term >> "+" >> term) [_val = _1 + _2]| 
       (term >> "-" >> term) [_val = _1 - _2]| 
       (term >> "*" >> term) [_val = _1 * _2]| 
       (term >> "/" >> term) [_val = _1/_2]| 
       double_     [_val = _1] ; 

Я предполагаю, что это имеет какое-то отношение рекурсии двусмысленности ... Что делает второе правило пытается делать при подаче: «1 + 2 + 3»?

Есть ли хороший документ, который схематически объясняет, как выполняется синтаксический анализ духа? Я имею в виду как чистый c или алгоритм, без шаблона или классов.

EDIT: На самом деле, я думаю, что второе правило должно завершиться неудачно во время компилятора, поскольку оно неоднозначно.

+0

Если это не двусмысленный _C++ _ код, компилятор разрешит его. – sehe

+0

с использованием проверки концепции boost и некоторых методов мета-программирования, я считаю, что дух может вернуть ошибку? не так ли? –

ответ

2

Дух является PEG-парсер:

Соответствующие цитаты:

Синтаксический PEGs также похожа на контекстно-свободные грамматики (CFGs), но они имеют различную интерпретацию: оператор выбора выбирает первый матч в PEG, в то время как она неоднозначна в CFG

Итак, нет, второй пример вообще не является двусмысленным, это просто приводит к бесконечной рекурсии (-> stackoverflow).

+0

большое спасибо! –