Help us understand the problem. What is going on with this article?

Golangでparserをつくって、SQLを解析してみよう!

More than 3 years have passed since last update.

Golangで、sqlとか、プログラムとか、DSLのパースってできないのかな、と調べていたら下記を見つけました。

https://blog.gopheracademy.com/advent-2014/parsers-lexers/

2014年時点ですでにできていたんですね。。

上記では、github.com/benbjohnson/sql-parserというリポジトリで説明してくれています。

おおまかな流れは、

  1. Token作成
  2. Lexer作成
  3. Parser作成

といったところです。

で、それらを呼び出す、mainがない。。。ということで、フォークして、main.goを実装してみました。

main.go
package main

import "strings"

func main() {
    query := "select * from my_table"
    println(query)
    r := strings.NewReader(query)

    //parser生成。queryをくわせる。
    parser := NewParser(r)

    //parse実行。SelectStatementのstructが取得できる
    stmt, err := parser.Parse()
    if err != nil {
        println(err.Error())
    }

    //取得結果を標準出力。
    println(stmt.TableName)
    for _, field := range stmt.Fields {
        println(field)
    }
}

実行してみると、parser.goで定義されたSelectStatementというstcuctが取得し、標準出力してくれます。

ここまでやって、antlrとかだと、select_statementっていったら、grammerファイルに記述されたルールだったような。。となります。

https://github.com/antlr/grammars-v4/blob/master/plsql/plsql.g4#L893:L895

plsql.g4
select_statement
    : subquery_factoring_clause? subquery (for_update_clause | order_by_clause)*
    ;

もやもやっとしたまま記事を進めていくと、なんとinfluxdbの内部でも利用している、とのことでした。

https://github.com/influxdata/influxdb/tree/master/influxql

ここにある、ast.goをみると、にたようなルールが記載されていました。でも長い。。

時間があるときに読み込んでみようと思います。

勉強になりました。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away