1

本当に良いエラー メッセージを生成できる、C++ 用の LALR パーサー ジェネレーターの最適なソリューションを探しています。私は MySQL が生成する構文エラーが本当に嫌いで、パーサーを取り込んで、それを「リント」チェッカーに置き換えたいと思っています。

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'a from users' at line 1

YACC/LEX と BISON/FLEX を使用しました。Mac または Linux で動作する必要があります。

4

2 に答える 2

3

なぜ LALR が必要なのですか? LL(k) パーサーの利点の 1 つは、多くの場合、明確なエラー メッセージを簡単に生成できることです。LALR パーサーで解析できるほとんどの文法は、LL(k) パーサーで解析できるように簡単にリファクタリングできます。

ANTLRは、C++ (および他の多くの言語) を生成できる、人気のある LL(k) パーサー ジェネレーターです。The Definitive ANTLR Referenceの第10章から:

多くの場合、言語アプリケーションのエラー メッセージと回復方法の品質によって、プロのアプリケーションとアマチュアのアプリケーションの違いが生じます。エラー回復は、パーサーが既知の状態で再起動できるようになるまで、入力ストリームを変更するかシンボルを消費することによって、構文エラーから回復するプロセスです。この章で示すように、多くの手作りおよび多くの非 LL ベースの認識エンジンは、最適とは言えないエラー メッセージを出力しますが、ANTLR で生成された認識エンジンは、非常に優れたエラー メッセージを自動的に出力し、インテリジェントに回復します。

MySQL 文法を含む多くの文法も ANTLR で利用できます

于 2009-12-07T07:04:31.917 に答える
0

ANTLR で問題が完全に解決されない場合は、basil を検討してください。これは、C++ パーサーを作成するために設計および作成された LR(1) パーサー ジェネレーターです。

于 2009-12-09T11:09:58.647 に答える