以下は、私がやろうとしていることに対してうまく機能しますが、明らかに非常に反復的です。次の例と一致する必要があります。
- #id.class1.class2 attr="asdsa"
- .class1.class2 attr="asdsad"
- attr="asds"
使いたくなる
id:idShortcut? classes:classShortcut* attrs:fullAttribute*
しかし、3 つのコンポーネントがすべて欠落している場合は一致させたくありません。3 つのオプション コンポーネントのルールを指定するにはどうすればよいですか?ただし、少なくとも 1 つが存在する必要があります。
attributes = id:idShortcut classes:classShortcut* attrs:fullAttribute*
{
var ret = [['id', id]];
for(var i = 0; i < classes.length; ++i ) {
ret.push(['class', classes[i]]);
}
for(var i = 0; i < attrs.length; ++i ) {
ret.push(attrs[i]);
}
return ret;
}
/ classes:classShortcut+ attrs:fullAttribute* {
// TODO: how to dry this with the above?
var ret = [];
for(var i = 0; i < classes.length; ++i ) {
ret.push(['class', classes[i]]);
}
for(var i = 0; i < attrs.length; ++i ) {
ret.push(attrs[i]);
}
return ret;
}
/ attrs:fullAttribute+ {
var ret = [];
for(var i = 0; i < attrs.length; ++i ) {
ret.push(attrs[i]);
}
return ret;
}