При реализации реальных языков (TM), я часто сталкиваюсь с ситуацией, как это:значения Pass в качестве аргументов правил
(* language Foo *)
type A = ... (* parsed by parse_A *)
type B = ... (* parsed by parse_B *)
type collection = { as : A list ; bs : B list }
(* parser ParseFoo.mly *)
parseA : ... { A (...) }
parseB : ... { B (...) }
parseCollectionElement : parseA { .. } | parseB { .. }
parseCollection : nonempty_list (parseCollectionElement) { ... }
Очевидно (в функциональном стиле), было бы лучше, чтобы пройти частично разобран collection
записывать для каждого вызова семантических действий parseA
и parseB
и соответственно обновлять элементы списка.
Это возможно даже с использованием menhir, или нужно использовать уродливый взлом использования изменяемой глобальной переменной?
Звучит разумно. Вместо того, чтобы передавать частично обработанную коллекцию вперед в смену, я, очевидно, также могу обновить ее при сокращении по пользовательскому рекурсивному правилу ... Я рассмотрю ее и дам вам знать, если это сработает. – choeger