6
|
Lasse Espeholt · 技术社区 · 14 年前 |
1
4
我完全用XSLT2.0实现了一个XPath2.0解析器。 三年前。 我用我的 LR Parsing Framework 在里面 FXSL 这并不难。语法相当大——209条规则,如果我记得的好的话。我用了一个修改的yacc(由我做)我称之为 Yaccx 将解析表生成为XML。这些是输入 the general LR Parser ,用XSLT编写。 对于此类项目,您需要分配至少6个月的全职时间,可能1年。 . 困难在于实现庞大的函数库( F & O ) 另外,xpath不是一种独立的语言——它必须由另一种语言托管。 . 由于这个原因,我没有将这个解析器用于任何有意义的东西,因为我没有访问权、影响力和改变现有宿主语言的可能性。 所以,要为这些困难做好准备。 |
2
4
我是XQSharp的开发人员之一,所以我在这方面有经验。XQSharp实际上是在我们将其扩展为支持XQuery之前作为一个XPath实现开始的。 我们最初的实施花费了大约6个月的时间,尽管这不是我们当时唯一在做的事情。 在这之后,我们有了一个功能完成的实现。在许多领域中,标准.NET方法的行为与所需的规范不完全一致。这方面的一些例子包括字符串之间的值转换、正则表达式、大量的Unicode内容、XML的.NET表示的问题(例如XML:Base的处理)等等。 要实现这一目标,需要做几个方面的工作: 句法分析 : 解析器本身很简单,主要是由规范中的ebnf生成的。我估计这最初代表了几个星期的工作。 数据模型 : 数据的表示方式。为了实现完整的XPath,需要实现许多新的数据类型(如xs:gday)。在我们的例子中,所有的项都是从基类型派生的,并且所有的表达式都将返回这些项的枚举器。您还需要能够识别项目的类型是否匹配特定的XPath类型。我们从一开始就支持静态类型和模式感知,如果没有这些特性,这个部分可能变得微不足道,但是您仍然需要花费数周的时间来完成工作。 表达式/抽象语法树 这是表达式本身的模型。我们使用XQuery形式语义文档来生成从各种XPath构造(例如轴和谓词)到更简单的核心语法(最终得到大量的let、if和typeswitch表达式!).在我们的初始实现中,所有这些表达式都有评估方法,表达式的最终表示也是如此。在我们的例子中,表达式也都有类型检查方法,但是可以在开始时跳过(这些方法的主要目的是为了优化)。重新创建所有这些表达式需要几个星期。 功能 正如前面的一位评论者指出的那样,xpath的函数库相当大。整个XPath库花了我们几个月的时间来实现。 静态分析 需要进行少量的静态分析。变量引用和函数调用必须绑定到正确的变量和函数。大多数XPath实现是基于堆栈的,因此需要一个堆栈分配阶段来为所有变量分配指针(或索引)。这个静态分析花了一两周时间。龙书应该能很好地帮助你解决这些问题。 你可能在考虑下一个月的工作价值,因为这些额外的工作不属于这些类别。 在完成所有这些工作之后,我们剩下的大部分都是XPath的功能实现;但是对于现实世界的使用来说,它要慢得多(可能比.NET中的XPath1慢100倍)。在这之后,有趣的工作-优化。 使引擎达到100%的一致性并添加优化可能需要12-18个月的时间(尽管我们可能在优化方面有点过分!)但是到那时,我们已经向XQuery实现过渡了。 我的建议是从处理一个xpath子集开始(可能只处理正向轴和非常有限的函数库),您可以在一两个月内拼凑出一个实现,但是一个真正的xpath2实现将是一个巨大的投资。 请确保将xpathnavigator用于节点表示,因为它具有类似selectChildren的方法,这些方法可以利用底层表示中的索引(例如xpathdocument)。 |
batman · 如何用特定模式grep特定行及其子网行? 2 年前 |
Jensen Holm · 在非常大的字符串中查找链接时遇到问题 2 年前 |
MBF · PHP导入/解析XML文件内容保存到数据库 2 年前 |
user10717742 · 用java编写的自定义文件解析器需要改进 2 年前 |
Muhsin Muhammed · 向文件中的行添加引号和逗号 2 年前 |
Felkru · 添加字符串会在Javascript中返回空字符串 2 年前 |
Mustard Tiger · 熊猫解析文本列 2 年前 |