私はANTLR3を使用して以下を行っています。
SQLクエリがあると仮定します。一般に、WHERE、ORDER BY、およびGROUPBY句はオプションです。ANTLRの文法に関して、私は次のように説明します。
クエリ:select_clause from_clause where_clause?group_by_clause?order_by_clause?
各句のルールは、明らかにそれぞれのキーワードで始まります。
私が実際に必要としているのは、各句の内容を、その内部構造を処理せずに文字列として抽出することです。
これを行うために、私は次の文法から始めました。
クエリ: select_clause from_clause where_clause?group_by_clause?order_by_clause? EOF; select_clause: SELECT_CLAUSE ; from_clause: FROM_CLAUSE ; where_clause: WHERE_CLAUSE ; group_by_clause: GROUP_BY_CLAUSE ; order_by_clause: ORDER_BY_CLAUSE ; SELECT_CLAUSE:'select' ANY_CHAR *; FROM_CLAUSE:'from' ANY_CHAR *; WHERE_CLAUSE:'where' ANY_CHAR *; GROUP_BY_CLAUSE:'group by' ANY_CHAR *; ORDER_BY_CLAUSE:'順序'ANY_CHAR *; ANY_CHAR:。; WS:'' + {skip();};
これはうまくいきませんでした。正しい文法を作成しようと試みましたが、成功しませんでした。このタスクはANTLR3で実行できると思いますが、smthが不足しています。
より一般的には、新しいトークンの開始を示す特定のキーワードに出会うまで、入力ストリームから単一のトークンに文字を収集できるようにしたいと思います。このキーワードは、新しいトークンの一部である必要があります。
手伝ってくれませんか。