Может ли Instaparse или другая библиотека Clojure использоваться для анализа языка с отступом? Я видел примеры использования Instaparse для анализа грамматик, выраженных в EBNF/ABNF. Есть ли хороший способ использовать его для анализа языка с отступом, такого как Python?
Могу ли я анализировать язык с отступом, используя Instaparse или любые другие библиотеки clojure?
Ответ 1
По-видимому, вы не первый человек, имеющий эту проблему с Instaparse.
С большинством генераторов парсеров вы решили бы эту проблему с помощью пользовательского лексера, используя некоторые варианты схемы, предложенной @andrewcooke. Тем не менее, Instaparse был разработан, чтобы избежать необходимости в lexer и, следовательно, не предоставляет интерфейс, который использует его.
Этот недостаток был специально поднят в проблеме 9, заменен на issue 10; в последнем случае автор Instaparse предлагает обходное решение:
Тем временем у вас может возникнуть обходное решение. Вы можете сопоставить маркеры, такие как INDENT и DEDENT, с неиспользуемыми символами, а затем перестроить их как строку, а затем запустить instaparse. Я считаю, что символы ASCII 0-8 и 11-31 не используются и могут служить в качестве токенов.
Это, безусловно, возможность, хотя это и эстетическое суждение относительно того, что "делает что-то очень взломанное". Тем не менее, вы можете написать такой взлом в надежде, что его можно будет удалить, как только проблема 10 будет решена. Возможно, вы захотите присоединиться к обсуждению этой проблемы.
Ответ 2
Как правило, для синтаксического анализа на основе отступа требуется три вещи:
-
расширяет токенизатор, чтобы сделать токен из ведущих пробелов в каждой строке
-
обрабатывать поток токенов, для каждой строки, сравнивающей начальные пробелы с текущий контекст и указывает, есть ли увеличение или уменьшение (так что вы меняете имея токен в начале каждой строки, чтобы иметь токен, когда уровень отступа изменения)
-
написание "нормального" парсера, который знает о токенах, которые указывают на изменение отступа уровень.
в зависимости от языка, который может потребоваться для обратной связи некоторой информации из третьей части во вторую часть.
Я ничего не знаю об instaparse (единственная причина, по которой я отвечаю, это то, что люди, которые спрашивают "что вы пробовали до сих пор?" на таких вопросах, как это действительно меня разозлило), вам нужно посмотреть, есть способ разместить второй этап между токенизатором и парсером (я просмотрел документы, и у него, похоже, нет ничего, что делает вторую часть для вас, но вы могли бы написать это сами). но он должен иметь возможность делать первую и третью части ок.