Насколько я мог понять, обыскивая в Интернете, похоже, что 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 парсера высоко ценятся.
Спасибо за общее описание, но похоже, что вы не ответили на мой конкретный вопрос. Как внутренняя машина Camlp4 работает с грамматиками выражений, которые являются леворекурсивными и как они используют LEFA, RIGHTA, NONA и информацию уровня, чтобы получить правильный вывод? – Wickoo
Вы имеете в виду, как в частности генерируются функции? – ivg
Да, вроде. Как эта спецификация переводится в функции (или другие механизмы). Учитывая левое правило, как мы это делаем? – Wickoo