Компилятор компилятор в C#

Я ищу настраиваемый синтаксический анализатор и / или лексер, который может позволить мне создать пользовательскую проверку синтаксиса в C#. По сути, пользователь вводит код в строку кода (пользовательский), и средство проверки синтаксиса сможет ответить, правильно ли оно написано или нет.

7 ответов

Вот несколько вещей, которые вы можете использовать:

Это ирония. Обязательно прочитайте обсуждение, потому что там много чего происходит. Используйте старую версию от ноября или самую последнюю, но затем убедитесь, что вы понимаете, что находится в этой версии, а что нет.

Для большинства вещей ноябрьский выпуск должен работать хорошо (используя его в любимом проекте).

Ирония позволяет построить абстрактное синтаксическое дерево (AST) из любой грамматики, которую вы можете определить непосредственно в коде C#. Он также поддерживает оценку (то есть интерпретацию кода), и даже нетрудно построить код из него. Или, ну, преобразовать его в DST (динамический язык Runtime) AST.

Мне нравится ANTLR, он поддерживает C#, а также Java, Python, C и т. Д. И т. Д. Плюсы использования ANTLR - очень хорошая документация (примеры, книги, учебные пособия и т. Д.) И широкое использование.

Я использую синтаксический анализатор с рекурсивным спуском, который сочетает в себе синтаксический анализ и лексизм, которые я написал с нуля в C#, в моем собственном языковом проекте. Я обнаружил, что это облегчает написание правил грамматики. Смотрите здесь для примера грамматики и посмотрите здесь для модульных тестов.

Если пользователь вводит строку кода, соответствующую традиционным выражениям, вы можете вручную написать для этого рекурсивный анализатор спуска за несколько часов и покончить с этим.

Если ваш ввод является фрагментом сложного языка (например, вы хотите принять строку кода C#), вам понадобится намного более сильный анализатор, и рекомендуется использовать генератор синтаксического анализа.

Тем не менее, вы обнаружите, что большинство генераторов синтаксического анализатора не предлагают вам хороший способ для анализа части языка, который вы определяете, но вы можете обойти это, определив правило грамматики корня, чтобы упомянуть нетерминалы, которые соответствуют "линии", которые вы готовы принять.

Отсюда:

LINQPad использует ряд сторонних компонентов в пользовательском интерфейсе. Редактор запросов использует элемент управления Actipro SyntaxEditor (очень отточенный продукт); функции "IntelliSense" основаны на комбинации библиотек от Actipro Software и ICSharpCode (из проекта SharpDevelop).

Я не использовал ни один из продуктов, упомянутых в этом отрывке (кроме LINQPad - который я очень рекомендую!), Но подумал, что он может начать двигаться в правильном направлении, возможно.

Я использую QWhale .NET Editor. Это не бесплатно, но это довольно хорошо.

Другие вопросы по тегам