2009-07-06 67 views
9

我在写解析器来解析CSS。如何测试CSS解析器?

我通过修改CSS reference grammar开始,使用我正在使用的3rd-party parser generator tool支持的任何语法和词法分析器语法。

我认为我已经完成了语法的编码:解析器生成器现在能够为我的语法生成状态转换表。

结果(解析器 - 生成器的输出)大约为116个“规则”,这对应于switch语句中的116个个案。这些规则/ switch语句的实例是:

  1. 样式表开始于指定字符集
  2. 样式开始,而不指定字符集:
  3. 样式表是空的
  4. 样式表以空格开头
  5. ... etc ...

解析器生成器已经为我做了所有的事情,现在我开始写(用手)各种switch语句的例子,这将构建我认为人们称之为“抽象语法树”的东西。

我的问题是关于如何测试这个。我认为我想要的是一组运行各种组合和可能性的CSS文件:例如一个指定字符集的CSS文件;另一个不指定字符集的文件;等

  • 一般的方式自动生成该组输入数据,对于任意语法或一组规则?

  • 或者,是否有一组专用 CSS文件,其目的是覆盖标准CSS语法所允许的组合和可能性?

如果我对这一切都错了,随意评论。

目前我不需要:

  • 文件来测试非法输入的处理(即不符合语法的文件)

  • 如何测试各种浏览器基于他们解析CSS渲染的

回答

2

上下文无关文法隐含提出了一组无限的(解析)树。每个提议的树都有一组叶子,这些叶子以语法接受的语言形成具体的句子。通过探索提出的树集(例如,根据可能的替代方案扩展每个非终结符),可以生成该语言的任意实例。您可以通过走树建议和随机选择来生成一组测试。更有重点的方法是使用迭代加深搜索来生成按大小排序的句子。用任何有趣的语法,你可能会得到大量的实例,但嘿,这就是自动化测试的目的。

我不会做的就是从你的生产语法中生成这样的句子,因为你生成的句子按照定义将是它接受的句子: - {你应该做的是用参考来构造你的句子生成器语法,利用您接受的内容以及您实施的内容可能会有所不同。

+0

用我的语法,我有大约55个非终端。如果我将它评估为自顶向下的解析器,那么与顶级非终端关联的方法将调用与较低级别非终端关联的方法,以此类推。每个非终端方法调用大约1到3个低级方法(通过方法内的`switch`语句),并由1个或有时2个不同的高级方法调用。这将是什么,甚至只是得到完整的代码覆盖率:确保每一种可能性都经过至少一次测试(不希望每种可能性的每种组合),... – ChrisW 2009-07-11 21:20:45