2013-11-27 3 views
1

Я хочу использовать Infragistics синтаксис разбора двигателя, чтобы сделать что-то вроде этого:Как использовать синтаксический синтаксический анализатор синтаксиса?

  1. Пользователь определяет грамматику для языка в формате EBNF.
  2. Грамматика, определенная выше, используется для проверки того, действителен ли пользователь, введенный в текстовое поле (т. Е. Соответствует или может соответствовать указанной выше грамматике) или нет.

Я прочитал всю имеющуюся у них документацию, и я не вижу, какой хороший первый шаг был бы. Любая помощь будет оценена по достоинству.

ответ

4

Я работаю над синтаксическим анализатором для Infragistics, и это звучит как идеальный способ его использования. Тип парсера, созданного каркасом, полностью основан на экземпляре Grammar, и этот класс может быть создан из файла EBNF. У нас есть пользовательский формат, который может использоваться в специальных последовательностях в начале файла или перед каждым определением нетерминальных символов для предоставления атрибутов символа грамматики или нетерминала, соответственно, но нормальный EBNF без этих специальных атрибутов также распознается , Для справки по этому формату вы можете просмотреть эту ссылку: http://help.infragistics.com/doc/WPF/2013.2/CLR4.0/?page=IG_SPE_EBNF_Format.html. А для справки о структуре в целом см. Эту ссылку: http://help.infragistics.com/doc/WPF/2013.2/CLR4.0/?page=IG_SPE.html.

Чтобы создать экземпляр Grammar, содержащий определение грамматики документов, подлежащих анализу, вы можете использовать один из статических методов Grammar.LoadEbnf (...) для создания экземпляра грамматики из файла EBNF или исходного содержимого EBNF или вы можете построить грамматику вручную, добавив терминальные и нетерминальные символы с помощью кода. Для ваших целей это звучит лучше всего, если использовать метод LoadEbnf и просто передать ему EBNF, указанный пользователем.

После создания экземпляра Grammar вам необходимо создать для него синтаксический анализатор. Все это обрабатывается внутри, когда грамматика завернута в производный класс LanguageBase. Вы можете использовать генератор кода для записи производного языка, специфичного для вашей грамматики (с помощью метода LanguageGenerator.GenerateClass), или вы можете создать новый экземпляр CustomLanguage, передав его в свой конструктор. Для ваших целей это звучит так, как последний вариант является лучшим. Это позволяет вам читать EBNF и создавать экземпляр языка во время выполнения без необходимости генерации кода и повторной компиляции.

Как только у вас есть экземпляр LanguageBase, представляющий вашу грамматику и парсер, все, что вам нужно сделать, это указать его в свойстве TextDocument Language. Если у вас есть XamSyntaxEditor, в котором пользователь может вводить ввод, свойство Document этого редактора будет экземпляром TextDocument, и вы должны установить свойство Language в этом экземпляре. Затем редактор автоматически отобразит ошибки для контента, который неверен на основе определения грамматики. Если у вас нет редактора или вам нужен более программный контроль над обнаружением ошибок, вы можете создать TextDocument, задать его текст с помощью метода InitializeText, проанализировать текст с помощью методов Parse() или ParseAsync(), а затем получить анализируемый контент с использованием свойства SyntaxTree.

SyntaxTree содержит древовидное представление проанализированного текста в структуре, которая точно соответствует определению грамматики (любой требуемый контент, отсутствующий на входе пользователя, будет содержать узлы ошибок, представляющие этот контент, и любой неожиданный контент будет в ведущем игнорированном содержимом коллекции следующего узла в дереве). Из этого SyntaxTree вы можете получить доступ к свойству RootNode.ContainsDiagnostics, чтобы узнать, есть ли ошибки во всем дереве (вы также можете использовать ContainsDiagnostics на любом внутреннем узле, чтобы увидеть, есть ли ошибки на этом узле или внутри него). И вы можете использовать метод GetDiagnostics на узле для перечисления всех ошибок на этом узле или внутри него.

Надеюсь, я смог помочь.Дайте мне знать, если что-то неясно или вам нужна дополнительная информация. Кроме того, ознакомьтесь с моим блогом для получения дополнительной информации о разборе: http://www.infragistics.com/community/blogs/mike_dour/

+0

Отличный ответ, я очень доволен, когда Infragistics дает такую ​​поддержку – Steve

+0

Отличный ответ Майк; это было действительно полезно. Я смог получить что-то простую работу; теперь работая над реализацией всего этого. Я буду отмечать, как принято, когда у меня есть это. Спасибо, блог. –

Смежные вопросы