2011-06-30 80 views
4
.someDiv { width:100%; height:100%; ... more properties ... } 

如何在我的解析器中构建一条匹配上面字符串的规则?Lexing和解析CSS层次结构

似乎对我来说不可能,因为你不能在规则中定义无限量的属性?有人请澄清,你会怎么做这样的事情与FsLexFsYacc

+1

我不明白困难在哪里。如果您需要解析示例,请查看ocamlyacc教程。如果问题是属性的数量,请将属性放在字典中;在fsyacc中,匹配冒号前的任何单词。 – Laurent

回答

2

如果您使用的是FsLex和FsYacc,那么您可以将{ ... }中的属性解析为属性列表。假设你有一个正确的认识所有的特殊字符的词法分析器和你有一个分析个人财产的规则,你可以像写些东西:

declaration: 
    | navigators LCURLY propertyList RCURLY { Declaration($1, $3) } 
    | navigators LCURLY RCURLY    { Declaration($1, []) } 

propertyList: 
    | property SEMICOLON propertyList { $1::$2 } 
    | property       { [$1] } 

property: 
    | IDENTIFIER COLON values   { Property($1, $3) } 

declaration规则解析整个声明(你需要编写解析器对于可以在CSS中使用的各种导航器,例如div.foo #id等)propertyList规则解析一个属性,然后递归地调用自身以解析多个属性。

在右侧构建的值将成为表示各个属性值的列表。 property规则解析各个属性分配,例如width:100%(但您需要完成值的解析,因为这可能是一个列表或更多的compelx表达式)。

+3

难道这不能重构到http://www.pastie.org/2144473?或者FsYacc实际上将|与不同的含义联系在一起比原来的yacc在这里? – 2011-06-30 11:56:48

+0

@Zor抱歉,延迟回复,但您的问题的答案是肯定的,不是。它应该工作得很好。 –