4

私は単純な C アプリケーションに取り組んでおり、アプリケーションのいくつかの動作を定義する DSL を作成するという考えがありました。アイデアは、Ruby に似た非常にクリーンな言語を作成することですが、実際には C で実行されます。すべての関数は C で定義されており、DSL はただ...まあ、C の冗長な構文を「隠す」ためのエイリアスです。 .

私は lex と yacc を知っていますが、私がやろうとしていることにはやり過ぎだと思います。もっと簡単なものはありませんか?正規表現も考えましたが、そうすると汚く感じます。たぶんもっと良いものがあります!

例:

if a = b
    myFunctionInC()

get 'mydata' then
    puts 'Hello!'

次のように簡単に変換できます。

if (a == b) {
    myFunctionInC();
}

void get(string test)
{
    printf('Hello! %s', test);
}
4

4 に答える 4

3

アプリケーションのいくつかの動作を定義する DSL を作成します。アイデアは、Ruby に似た非常にクリーンな言語を作成することですが、実際には C で実行されます。

C は組み込み言語のホストとして適していません。これは言語ランタイムの優れた実装言語であるため、アプリケーションをスクリプト化したい場合は、他の人が行うことを検討し、高水準言語をアプリにリンクしてください。

Lua などの言語は、この目的のために設計されています。つまり、C よりも簡単に記述できます。Ruby、Python、Haskell などから C を呼び出すこともできます。

既存の言語を再利用することは良い考えです。他の誰かがすでに大変な作業を行っているからです。ライブラリも再利用できます。

于 2012-05-08T20:09:38.783 に答える
1

私は単純な C アプリケーションに取り組んでおり、アプリケーションのいくつかの動作を定義する DSL を作成するという考えがありました。アイデアは、非常にクリーンな言語を作成することです...実際にはCで実行されます.

この考えを持ったのはあなたが初めてではありません。John Ousterhout は、このアイデアをTcl/Tkで普及させました。残念ながら、この言語はあまりきれいではありません。

現在利用できるこのアイデアの最も明確な実現は、組み込み言語Luaです。非常によく設計されており、非常に強くお勧めします。(Lua を使用する代わりに) 独自のものを構築する唯一の理由は、組み込みプログラミング言語の実装方法を学びたいからです。その場合でも 、Lua の設計を研究することで多くのことを学ぶことができます。

私は lex と yacc を知っていますが、私がやろうとしていることにはやり過ぎだと思います。もっと簡単なものはありませんか?

ほとんどの場合、lex を使用するよりも手でレクサーを作成する方が簡単です。

yacc は別の話です。根本的に単純なものは実際にはありません。なぜなら、文脈自由言語の全機能を実際に扱わなければならないからです。しかし、この洗練されたテクノロジーは他のパッケージにも見られます (Lex と yacc は、1970 年代のハードウェアの制約のために設計された 1970 年代のテクノロジーであり、ヒューマン インターフェイスが貧弱です)。

  • LL(1) 文法の設計方法を知っていれば、手書きの再帰降下パーサーは非常に簡単に作成でき、追加の技術は必要ありません。しかし、知識を習得するのはそれほど簡単ではなく、これらを C でコーディングするのはあまり楽しくありません。

    学びたい場合は、ニクラウス ヴィルトの著書に優れた例があります。LL(1) のチュートリアルとオンラインの再帰的降下もあるかもしれません。

  • LALR(1) 文法に限定されない、より最新のパーサー ジェネレーターを使用する方が簡単な場合があります。たとえば、おそらくElkoundパーサー ジェネレーターです。しかし、これも単純ではありません。

于 2012-05-09T01:13:34.430 に答える
1

良い言語を作りたければ、正規表現だけに頼ることはできないと思います。

複雑なパターンにマッチする正規表現を書くのも難しいでしょう。

C 言語の冗長性を隠したい場合は、C MACRO を使用できます。

于 2012-05-08T18:47:36.870 に答える
1

適切な DSL 構文を定義するのは困難です。どの問題を解決したいのか (そしてどの問題を解決したくないのかを理解しなければなりません。そうしないと、台所の流しを含むすべてのものになってしまいます)、それをターゲット言語に翻訳する方法を理解する必要があります (またはその場で解釈します)。

どちらの場合もパーサーが必要であり、興味深い DSL 構文を正規表現で解析するのは一般的に実用的ではありません。したがって、実際のパーサージェネレーターが必要です。Ruby のようなものに取り組む場合は、強力なパーサー ジェネレーターが必要です。

次に、解析の結果を何らかのデータ構造 (通常はツリー) としてキャプチャする必要があります。次に、特殊なケースや最適化について DSL コードを分析し、コードの生成方法を理解する必要があります。これが意味することは、通常、パーサーでは十分ではないということです。Life After Parsingに関する私の詳細な議論を参照してください。

于 2012-05-08T20:12:35.677 に答える