ANTLRを使用してCSS、または少なくとも基本を解析しようとしています。ただし、レクサールールでいくつかの問題が発生しています。問題は、ID セレクターと 16 進数のカラー値の間のあいまいさにあります。わかりやすくするために簡略化された文法を使用して、次の入力を検討してください。
#bbb {
color: #fff;
}
および次のパーサー規則:
ruleset : selector '{' property* '}';
selector: '#' ALPHANUM;
property: ALPHANUM ':' value ';' ;
value: COLOR;
およびこれらのレクサー トークン:
ALPHANUM : ('a'..'z' | '0'..'9')+;
COLOR : '#' ('0'..'9' | 'a'..'f')+;
#bbb はセレクターであるはずなのに、COLOR トークンとしてトークン化されているため、これは機能しません。16 進数で始まらないようにセレクターを変更すると、正常に動作します。これを解決する方法がわかりません。特定のトークンが特定の位置にある場合に、特定のトークンを COLOR トークンとしてのみ扱うように ANTLR に指示する方法はありますか? たとえば、それがプロパティ ルール内にある場合、それはカラー トークンであると安全に想定できます。そうでない場合は、セレクターとして扱います。
どんな助けでも大歓迎です!
解決策: 文法でやりすぎたことがわかったので、おそらく AST を使用するコードで対処する必要があります。CSS にはあいまいなトークンが多すぎて、異なるトークンに確実に分割できません。そのため、私が現在使用しているアプローチは、基本的に「#」、「.」、「:」などの特殊文字と中括弧をトークン化し、消費者コード。はるかにうまく機能し、エッジケースへの対処が容易になります。