web-dev-qa-db-ja.com

文法を拡張するために、ユーザーにBnfExpressionsを記述させる必要がありますか?

序文

私はテンプレート言語を設計しています(しない/なぜ??のスピーチをスキップしてください)。この言語の主要な目標の1つは、拡張可能であることです。私の言語には2つの主要な要素があります。 「タグ」と「ディレクティブ」。タグは、ほとんどの場合、1対1でHTMLタグにマップされますが、少し多くのことを行うタグもいくつかあります。 「ディレクティブ」は、条件付きループやfor/whileループなどです。

「タグ」はすべて同じ構造に従うため、単純です:tag_name(arg1=val1, arg2=val2) { content }

ディレクティブは次のようになっているため、より複雑です:directive(anything-can-go-here) { content }

質問

ユーザー(テンプレート言語を使用している他の開発者)が独自のディレクティブを作成できるようにする方法を決定しようとしています。つまり、「何でもここに行くことができる」部分を定義します。

言語の解析に Irony を使用しています。彼らに同じレベルのアクセス権を与え、彼ら自身のBnfExpressionを定義する必要があります(少し皮肉を学ぶ必要があります/ [〜#〜] ebnf [〜#〜] )、または、文字列(()の間のもの)を投げて、好きなように解析させる必要がありますか?

私の懸念

前者はおそらくより強力で扱いやすいですが(一度知ってしまえば)、潜在的にあまりにも多くの力を与える可能性があります(私がいない限り、次の)で停止する必要はありません)最初に内側の文字列を取り除き、次に基本的にそれだけを解析するサブ文法を定義させます)。

これにアプローチする方法がわからない。

タグの詳細

参考までに、ユーザーは次のように「タグ」を定義できます。

class ANode : HtmlNode
{
    public ANode(AttrDict attrs, params TagNode[] children)
        : base("a", attrs, children) { }
}

すでに定義したHtmlNodeを拡張する、最も基本的な例になります。より複雑なものは、いくつかのデフォルト属性を定義するか、子要素で何か凝ったことをするか、または複数のhtmlタグを生成するかもしれません。

7
mpen

この決定に入る必要がある多くの要因があります。考慮すべき点がいくつかあります。

要件:この機能が存在する必要があるユースケースはありますか、またはこの機能を提供すると大幅に配信が容易になりますか? ?

スケジュール:この機能を追加すると、プロジェクトの完了が遅れる場合があります。製品の発売が遅れた場合、あなた(またはあなたの会社)はどのくらいのお金を失いますか?

コスト/利益のトレードオフ:この機能を提供するにはコストがかかります。コードを作成する必要があり、テストケースを作成する必要があり、テスターがこれらのテストを実行する必要があり、エンドユーザーのドキュメントを作成する必要があります。製品が展開されたら、この機能をサポートする必要があります。これらのコストを見積もり、この機能を提供することで得られるメリットとバランスを取ることができます。あなたはより高い価格であなたの製品を売ることができますか、それともあなたはそれらのより多くを売ることができますか?

2
Jay Elston