1
以下工作對我所要做的事情來說很好,但它顯然是非常重複的。它應與下面的例子:如何幹這個PEGjs規則?
- #id.class1.class2 ATTR = 「asdsa」
- .class1.class2 ATTR = 「asdsad」
- ATTR = 「ASDS」
這是誘人的使用
id:idShortcut? classes:classShortcut* attrs:fullAttribute*
但我不希望它匹配,如果所有三個組件都不存在。我如何指定3個可選組件的規則,但至少有一個必須存在?
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;
}