1

基本的に、言語には 3 つのリストと 3 つの固定長型があり、そのうちの 1 つは文字列です。正規表現を使用してトークンのタイプを検出するのは簡単ですが、それらをトークンに分割するのは簡単ではありません。

文字列は二重引用符で表記され、二重引用符はバックスラッシュでエスケープされます。

編集:

サンプルコード

{
     print (sum (1 2 3 4))
     if [( 2 + 3 ) < 6] : {print ("Smaller")}
}

のようなリスト

  • () は、必要な場合にのみ評価される引数リストです。
  • [] は、2 つのオペランド操作をよりきれいに表現するための特別なリストです。
  • {} は常に評価されるリストです。最初の要素は関数名、2 番目の要素は引数のリストで、これが繰り返されます。
  • any : anything [ : anything [: ...]] は、要素が :s で結合された引数リストに変換されます。これは、ループと条件の見栄えを良くするためだけのものです。

すべての関数は 1 つの引数を取ります。引数リストは、さらに必要な関数に使用できます。さまざまなタイプの eval 関数を使用して、引数リストを評価することができます。(リストモデルごとに評価関数があります)

したがって、これを理解すれば、これは Lisp と非常によく似た働きをし、コードを整形するためのリスト タイプが異なるだけです。

編集:@rici

[[2 + 3] < 6]もOKです。前述したように、引数リストは必要な場合にのみ評価されます。<は長さ 2 の引数リストを必要とする関数であるため、何らかの(2 + 3)方法で評価する必要があります。他の方法では、が に等しく、が無効な引数リストに[(2 + 3) < 6]変換されます。しかし、あなたが指摘したように、この場合の自動解析がどのように機能するかは自明ではありません。上で説明したバージョンは、 が次のような関数で引数リストを評価するというものですが、あなたは正しいと思います。そうする理由はありません。より良いコードにはつながらないからです。だからより良いコードです、私は同意します。< (2 + 3) : 6< (2 + 3 6)<[...]eval_as_oplist (...)[...][[. . .] . .]

4

3 に答える 3

0

独自の「Lisp に似ているが、より単純な」言語を発明するのではなく、既存の Lisp (またはスキーム) の実装を使用して、それを C++ アプリケーションに埋め込むことを検討する必要があります。

独自の言語を設計し、独自のパーサーとインタープリターを作成するのは確かに楽しいことですが、たとえば、Scheme よりも優れた設計で、より強力で、より効率的かつ堅牢に実装されたものを思いつくのは困難であり、それは多数の実装です。 .

Chibi スキーム: http://code.google.com/p/chibi-scheme/は、C/C++ コードに埋め込むのに特に適しています。非常に小さくて高速です。

于 2012-12-03T17:31:17.557 に答える
0

C++ 出力ターゲットを持つ Flex (おそらく Bison を使用) または ANTLR を使用することをお勧めします。

Google は自分のファイル サーバーで検索するよりも簡単なので、他のユーザーの例を次に示します。

http://ragnermagalhaes.blogspot.com/2007/08/bison-lisp-grammar.html

この例には書式設定の問題があり (テキスト エディターで HTML を表示することで解決できます)、1 種類のリストしかサポートしていませんが、開始するのに役立ち、アイテムをトークンに分割する方法を確実に示しています。

于 2012-12-02T23:20:43.137 に答える