私は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が不足しています。
より一般的には、新しいトークンの開始を示す特定のキーワードに出会うまで、入力ストリームから単一のトークンに文字を収集できるようにしたいと思います。このキーワードは、新しいトークンの一部である必要があります。
手伝ってくれませんか。
