Грамматика имеет левую рекурсию: variable -> component -> indexed -> variable
. PetitParser использует грамматики синтаксического анализа (PEG) , которые не могут обрабатывать левую рекурсию. Парсер PEG всегда выбирает левый вариант, пока не найдет совпадение. В этом случае он не найдет совпадение из-за левой рекурсии. Чтобы это сработало, нужно сначала устранить левую рекурсию. Устранение всех левых рекурсий может быть более сложным, так как вы также получите один через field
после устранения первого. Например, вы можете написать грамматику следующим образом, чтобы сделать левую рекурсию более очевидной:
variable = (variable , $[ , blah , $]) | (variable , $. , identifier) | identifier
Если у вас есть левая рекурсия, например:
A -> A a | b
, вы можете устранить ее следующим образом ( e - пустой анализатор)
A -> b A'
A' -> a A' | e
Вам нужно будет применить это дважды, чтобы избавиться от рекурсии. В качестве альтернативы вы можете выбрать упрощение грамматики, если вы не хотите анализировать все возможные комбинации идентификаторов.
Конечно, обратное проектирование возможно, но без спецификаций формата это потребует много работы. Я бы посмотрел на окупаемость усилий по поддержке этих «редко запрашиваемых, очень дорогих» форматов. Возможно, вам будет лучше потратить эти усилия на улучшение основных функций вашего приложения.
Другой аспект - связаться с компаниями, использующими эти форматы, объяснить свою цель, объяснить, что это помогает их продукту, и если они не считают вас конкуренция, в которой они могут быть готовы помочь.
Возможно, Вы могли выбрать более дешевое приложение, которое имеет функции импорта QuarkXPress. Например, InDesign должен смочь прочитать документы Кварка. Затем используйте приложение импорта для экспорта в любой формат, в котором Вы нуждаетесь - возможно, со справкой плагина.
Я знаю, что Вы хотите перепроектировать их - но так как они могут быть форматами файлов уместности, Вы смотрите на очень крутую кривую, пытающуюся декодировать их...
У некоторых (поскольку я записал некоторые propritety форматы для брюшного использования прежде) есть определенные методы и объекты, записанные в них, которые служат некоторому альтернативному процессу, чем само содержание файла. Материал, который доказал бы новый файл, недопустим.
Просто мои 2 цента и я не являются никаким адвокатом =>