2015-08-31 4 views
3

Насколько я мог понять, обыскивая в Интернете, похоже, что Camlp5 (бывший Camlp4) использует парсер с рекурсивным спусками, а ocamlyacc - это парсер, основанный на LALR генератор.Как выражаются выражения Camlp5 (прежние Camlp4)

В генераторе парсера LALR приоритет и ассоциативность отображаются для сдвига/уменьшения конфликтов. Мой вопрос заключается в том, как рекурсивный анализатор спуска, такой как Camlp5, может иметь дело с декларативным приоритетом оператора?

# let expr = Grammar.Entry.create gram "expr";; 
# EXTEND 
    expr: 
     [ "add" LEFTA 
     [ x = expr; "+"; y = expr -> x + y 
     | x = expr; "-"; y = expr -> x - y ] 
     | "mult" RIGHTA 
     [ x = expr; "*"; y = expr -> x * y 
     | x = expr; "/"; y = expr -> x/y ] 
     | "simple" NONA 
     [ x = INT -> int_of_string x 
     | "("; e = expr; ")" -> e ] ] 
    ; 
    END;; 

Как это работает с леворекурсивными вызовами? Есть ли camlp5 (camlp4) использовать табличного оператор старшинства подход: https://en.wikipedia.org/wiki/Operator-precedence_parser

Любых идеи или ссылки на внутреннюю работу Camlp4 парсера высоко ценятся.

ответ

0

Recursive Descent Parser не является парсером, управляемым таблицей, как LALR. Решения, сделанные парсером, жестко закодированы в функциональных телах (каждое правило является функцией). И действительно, CamlpNcompiles определение грамматики в набор взаимно-рекурсивных функций. Выигрышный момент здесь заключается в том, что вам не нужно вводить эти функции вручную. Итак, если вы измените грамматику, вы просто обновите определение грамматики, и все необходимые функции будут обновлены для вас. В регулярном ручном рекурсивном синтаксическом анализаторе вам необходимо будет обновить его самостоятельно, что очень подвержено ошибкам.

+0

Спасибо за общее описание, но похоже, что вы не ответили на мой конкретный вопрос. Как внутренняя машина Camlp4 работает с грамматиками выражений, которые являются леворекурсивными и как они используют LEFA, RIGHTA, NONA и информацию уровня, чтобы получить правильный вывод? – Wickoo

+0

Вы имеете в виду, как в частности генерируются функции? – ivg

+0

Да, вроде. Как эта спецификация переводится в функции (или другие механизмы). Учитывая левое правило, как мы это делаем? – Wickoo