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

上記の文字列と一致するパーサーのルールはどのようにして作成しますか?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ルールが全体の宣言を解析する(あなたはパーサを書く必要がありますdiv.foo #idなどCSSで使用できるさまざまなナビゲータ用)propertyListルールは1つのプロパティを解析し、複数のプロパティを解析するために再帰的に呼び出します。

右側に作成された値は、個々のプロパティを表す値のリストになります。 propertyルールは、個々のプロパティの割り当てを解析します。 width:100%(ただし、リストやより強力な式にすることができるため、値の解析を終了する必要があります)。

+3

http://www.pastie.org/2144473にリファクタリングできませんでしたか?あるいは、FsYaccは実際には異なる意味を|ここのオリジナルのyaccよりも? –

+0

@Zor遅れて申し訳ありませんが、質問に対する回答は「はい」と「いいえ」です。それはうまくいくはずです。 –