我想利用Infragistics的语法解析引擎做这样的事情:
- 用户定义用于在EBNF格式的语言的语法。
- 上文所定义的语法是用来验证在文本框的用户输入是否是有效的(即,匹配或可以匹配上面的语法)或没有。
我已阅读所有他们需要的文件,我看不出有什么好第一步将是。 任何帮助将不胜感激。
我想利用Infragistics的语法解析引擎做这样的事情:
我已阅读所有他们需要的文件,我看不出有什么好第一步将是。 任何帮助将不胜感激。
我对Infragistics的解析引擎工作,这听起来像使用它一个完美的方式。 类型由框架创建解析器的完全基于一个语法实例,并且这类可以从一个文件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。
一旦你的语法实例被创建,你需要创建一个解析器它。 当语法被包裹在一个LanguageBase派生类这一切都是内部处理。 您可以使用代码生成器写出一个派生类的语言具体到你的语法(通过LanguageGenerator.GenerateClass方法),或者你可以创建一个新CustomLanguage例如,通过语法给它的构造。 为了您的目的,这听起来像后一种选择是最好的。 这使您可以阅读EBNF并在运行时创建一个实例的语言,而无需生成代码和重新编译。
一旦你代表你的语法和解析器LanguageBase例如,所有你需要做的就是指定它在TextDocument的语言属性。 如果你有其中用户可以键入输入XamSyntaxEditor,这个编辑器的文档属性将成为TextDocument实例,您将设置在这种情况下,语言属性。 然后,编辑器会自动显示这是不正确的基础上,语法定义为内容的错误。 如果你没有一个编辑器,或者您想了解更多的编程控制溢检测错误,您可以创建一个TextDocument,将使用InitializeText法的文本,解析一个使用Parse()或ParseAsync()方法的文本,然后得到解析内容使用SyntaxTree财产。
所述SyntaxTree持有该语法定义完全匹配的结构解析的文本的树状表示(这是从用户的输入缺少任何必需的内容将有错误的节点插入代表该内容,任何意外的内容将在领先于树的下一个节点的忽略内容集合)。 从这个SyntaxTree,您可以访问RootNode.ContainsDiagnostics属性,查看是否有整个树(你也可以使用任何内部节点上ContainsDiagnostics,看看是否能节点上或在有错误)的任何错误。 你也可以使用一个节点上的GetDiagnostics方法枚举上或在节点内的所有错误。
我希望我能提供帮助。 让我知道如果有不清楚的地方,或者你想了解任何更多的信息。 此外,检查出我的博客上分析更多的信息: http://www.infragistics.com/community/blogs/mike_dour/