如何使用infragistics语法解析引擎?

时间:2013-11-27 21:08:11

标签: c# parsing infragistics ebnf

我想利用infragistics语法解析引擎来做这样的事情:

  1. 用户为EBNF格式的语言定义语法。
  2. 上面定义的语法用于验证文本框中的用户输入是否有效(即匹配或可能与上述语法匹配)。
  3. 我已经阅读了他们所有的文档,我看不出有什么好的第一步。 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分: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.LoadEbnf(...)方法之一从EBNF文件或原始EBNF内容创建语法实例,或者您可以通过使用代码添加终端和非终端符号来手动构建语法。出于您的目的,听起来最好的方法是使用LoadEbnf方法并将其传递给用户指定的EBNF。

创建Grammar实例后,您需要为其创建解析器。当语法包装在LanguageBase派生类中时,这一切都在内部处理。您可以使用代码生成器来编写特定于语法的派生语言类(通过LanguageGenerator.GenerateClass方法),也可以创建新的CustomLanguage实例,将语法传递给其构造函数。出于您的目的,听起来后一种选择是最好的。这允许您在运行时读取EBNF并创建语言实例,而无需生成代码并重新编译。

一旦你有一个代表你的语法和解析器的LanguageBase实例,你需要做的就是在TextDocument的Language属性上指定它。如果您有一个XamSyntaxEditor,用户可以在其中键入input,则此编辑器的Document属性将是TextDocument实例,您可以在此实例上设置Language属性。然后编辑器将根据语法定义自动显示不正确的内容错误。如果您没有编辑器,或者您希望对检测错误进行更多编程控制,可以创建TextDocument,使用InitializeText方法设置其文本,使用Parse()或ParseAsync()方法解析文本,然后获取使用SyntaxTree属性解析的内容。

SyntaxTree在结构中保存了与语法定义完全匹配的解析文本的树状表示(用户输入中缺少的任何所需内容都将插入错误节点来表示该内容,并且任何意外内容都将位于树中下一个节点的前导忽略内容集合中。在此SyntaxTree中,您可以访问RootNode.ContainsDiagnostics属性以查看整个树中是否存在任何错误(您还可以在任何内部节点上使用ContainsDiagnostics查看该节点上或该节点内是否存在错误)。您可以在节点上使用GetDiagnostics方法枚举该节点上或内的所有错误。

我希望我能够提供帮助。如果有任何不清楚或您想了解更多有关任何信息,请告诉我。另外,请查看我的博客,了解有关解析的更多信息:http://www.infragistics.com/community/blogs/mike_dour/