Parsing 词法分析和CSS层次结构

Parsing 词法分析和CSS层次结构,parsing,f#,Parsing,F#,我如何在解析器中建立一个与上面的字符串匹配的规则 对我来说似乎不太可能,因为你不能在规则中定义无限量的属性?请有人澄清一下,您将如何使用FsLex和FsYacc?如果您使用的是FsLex和FsYacc,那么您可以将{…}中的属性解析为属性列表。假设您有一个正确识别所有特殊字符的lexer,并且您有一个解析单个属性的规则,您可以编写如下内容: .someDiv { width:100%; height:100%; ... more properties ... } 声明规则解析整个声明(您需要为

我如何在解析器中建立一个与上面的字符串匹配的规则


对我来说似乎不太可能,因为你不能在规则中定义无限量的属性?请有人澄清一下,您将如何使用
FsLex
FsYacc

如果您使用的是FsLex和FsYacc,那么您可以将
{…}
中的属性解析为属性列表。假设您有一个正确识别所有特殊字符的lexer,并且您有一个解析单个属性的规则,您可以编写如下内容:

.someDiv { width:100%; height:100%; ... more properties ... }
声明
规则解析整个声明(您需要为可在CSS中使用的各种导航器(如
div.foo#id
等)编写解析器),
propertyList
规则解析一个属性,然后递归调用自身来解析多个属性


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

我不明白困难在哪里。如果需要解析示例,请查看ocamlyacc教程。如果问题是属性的数量,请将属性放入字典中;在fsyacc中,匹配冒号前的任何单词。是否可以将其重构为?或者FsYacc是否真的将|与原来的yacc联系在一起?Zor很抱歉延迟回复,但您的问题的答案是肯定和否定的。它应该可以正常工作。
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) }