私のプログラムの1つは、実行時に(kill foo
のような)コマンドを受け入れます。これをドメイン固有の小さな言語と考えてください。ここではいくつかの例です:CでDSLを解析するためのlex/yaccよりも優れたソリューションですか?
kill
kill client
exit
しかし、また、チェーンのコマンドが許可されていると空白は、コマンドの前と後に有意ではないので、以下の例も有効です。
kill ; say "that was fun"
kill ; kill ; kill;
私は現在、これを実装していますlex/yacc(flex/bisonを指定する)と頭痛の原因となっていました。レクサーは文脈に非常に依存します(例:kill
キーワードの後でなければ、空白トークンは返されません)、多くの異なる状態があります。文法はコンフリクトがあったので、指定しなければならない形式(特に$ 1、$ 2、$ 3、...非終端記号用の引数を使用する)が気に入らない。また、bisonが提供するエラーメッセージ(解析時)は正確な場合もありますが、多くの場合、エラーメッセージは表示されません。kill
コマンドでオプションの引数を指定すると、の代わりにUnexpected $undefined, expected $end or ;
というエラーメッセージが表示されます。kill client
)最後に、yaccのC APIは残酷です(外部はどこにでも定義されています)。
上記の質問をすべて解決するようには依頼していません(私は、lex/yaccの周りに道がない場合は、より具体的な説明とコードで個別のスレッドを開きます)。代わりに、私はlex/yaccの代替案に興味があります。
私の基準は次のとおりです。
- 入力が文字列(のconstのchar *)で、そこには出力されませんが、代わりにいくつかのコードは、それぞれ異なるキーワードに呼び出さなければなりません。
- 私はこれをC(C99)と使いたいです。
- ソフトウェアは、主要なLinuxディストリビューションに含まれているか、少なくともバンドル/パッケージが簡単である必要があります。
- 十分に文書化されていなければなりません。
- 私の言語を記述するための構文は簡単でなければなりません。
- エラーの解析時に意味のあるエラーメッセージを出力するはずです。
- パフォーマンスはそれほど重要ではありません(もちろん、高速であるべきですが、一般的な使用例はインタラクティブな使用であり、MBのコマンドを処理しません)。
キル、キル、キル! – Philip
@Philip:ええ、あなたは、すべてのレクサー/パーサーのものを乱してしまった気分を味わえます:) – Michael