Существует ли синтаксический анализатор, который генерирует дерево AST / синтаксического анализа во время выполнения? Что-то вроде библиотеки, которая будет принимать строку грамматики EBNF или что-то подобное и выдавать структуру данных?
Теперь я знаю о комбинаторах парсеров. (спасибо, Джонас) И некоторые библиотеки (спасибо eliben)
кстати, я также недавно заметил Анализ грамматик выражений, что звучит круто, если кто-то его реализует (они говорят, что Perl 6 будет иметь его, но Perl ускользает от моего понимания)
аюп. не знаю, о чем я говорю. парсеры. в этом смысле имеет больше смысла.





Lambda the Ultimate обсудила парсер, который позволяет расширения синтаксиса.
I'm projecting writing a compiler that would allow syntax extensions (some kind of compile-time metaprogramming). I don't want to have a very powerful system, so I've thought about just having:
{syntax: while (condition) do code} while (condition, code) => // actual executionand replace every pattern that matches the syntax with a call to the function. However, I don't know where to start to get the lexer and parser running, because usual tools such as Flex/Bison or ANTLR (I would like to write the compiler in C#) don't seem to allow this.
Could you provide me any direction on where to go next? I've also read that Scheme or Haskell could be better languages to achieve this task. And of course, I'm open to any suggestion about the actual idea to implement them.
Да, конечно !
Во всех динамических языках этого очень просто достичь, потому что код можно легко сгенерировать и оценить во время выполнения. Я порекомендую две альтернативы:
Я лично рекомендую вариант Python, хотя он может быть не актуален, если вы знаете Perl, но не Python.
Для полноты картины я должен отметить, что вы можете сделать это и с Lex & Yacc, но это сложно. Вам нужно будет сгенерировать файл Lex / Yacc из вашей грамматики во время выполнения, скомпилировать в C, скомпилировать его в общую библиотеку и загрузить во время выполнения. Это звучит как научная фантастика, но некоторые инструменты на самом деле делают это для сложных требований эффективности и динамичности.
Удачи.
JFlex, расширение JLex для Java, позволяет выполнять компиляцию во время выполнения, но это довольно непростая задача.
Взгляните на комбинаторы синтаксического анализатора, который, я думаю, может вам помочь. Используя эту технику, можно создавать синтаксические анализаторы во время выполнения. Одним из популярных комбинаторов синтаксического анализатора является Парсек, который использует Haskell в качестве основного языка. Из документация по parsec:
Combinator parsers are written and used within the same programming language as the rest of the program. There is no gap between the grammar formalism (Yacc) and the actual programming language used (C)
Parsers are first-class values within the language. They can be put into lists, passed as parameters and returned as values. It is easy extend the available set of parsers with custom made parsers specific for a certain problem
Если вы используете .NET, обратите внимание на файл библиотека комбинаторов парсеров для F#.
Что ты собираешься разбирать? В C или C++ у вас не будет парсера во время выполнения, поэтому он недоступен без дополнительной библиотеки. Однако для многих языков программирования это верно.
Все парсеры по умолчанию являются «динамическими», когда вы их реализуете. Даже в C.
Если язык, который вы собираетесь анализировать, является вашим собственным: написание парсеров - вещь, которую нужно выучить самостоятельно. Даже с генераторами парсеров это работа сама по себе. Однако после того, как вы его изучите, это станет довольно простым. Однако специальные приемы, такие как синтаксис с отступом, по-прежнему будут сложными, и вам потребуются хорошие и обширные тесты, чтобы убедиться, что синтаксический анализатор делает то, что вы хотите. Я написал парсер, поэтому знаю.
Отступы Python соответствуют HTML? Неплохая идея.
Если вам больше подходит Java, есть порт библиотеки Haskell Parsec - JParsec. Очень мощный, хотя документация невелика.
Вы можете заставить его выполнить прямой лексический анализ, а затем выполнить фазу синтаксического анализа, но вы можете делать некоторые интересные вещи с помощью динамического лексирования и динамических грамматик.
Головоломки крутят.
Поскольку все это на Java (ваш Parser - это POJO), вы можете проводить рефакторинг, выполнять TDD и все, что вы привыкли делать на Java. Это главное преимущество более традиционного подхода ANTLR / JavaCC / JJTree.
[Dropincc.java] http://pfmiles.github.com/blog/dropincc-dot-java-the-ultimate-tool-to-create-dsls-in-java/ "Dropincc.java - динамический генератор парсеров на чистом java".
Это позволяет вам определять правила грамматики на языке программирования java и не требует изучения дополнительных обозначений. Никаких других инструментов командной строки использовать не нужно. Вы можете определить, скомпилировать и «оценить» ваш новый язык на чистом java.
Перейдите по ссылке, чтобы получить дополнительную информацию.
[Домашняя страница проекта] https://github.com/pfmiles/dropincc.java
Я думаю, что вас интересуют парсеры, а не только лексические анализаторы. Как правило, лексический анализатор создает поток токенов из потока входных символов. Парсер создает AST из потока токенов. Вы можете подумать об изменении формулировки своего вопроса, чтобы привлечь нужную аудиторию.