butterfly dream

FX自動取引のための時系列分析・信号処理・戦略ブログ

科学技術計算用プログラミング言語:Sci-Lispの自作(11日目):GitHub Copilotの威力

chaploud-blog.hatenablog.com

Sci-Lisp自作の11日目です。乗り遅れ気味ですが、GitHub Copilotのライセンスを入手したのでRustによる字句解析を行うコードを書かせてみるなどしました。 正直、「AIが書くコードなんて信用できないわ」と思っていたのですが、Copilot君との対話を続けるうち、「これはやばい」という気持ちになりました。

字句解析・構文解析用クレート「Pest」を書かせてみた

Copilotに次のような指示を出しました。(履歴が消えてしまったので大まかです)

Clojure風のシンタックスを持つ言語の字句解析を行いたいと思います。Rustのクレートであるpestを用いた形式でコードを書いてください。

出来上がったコードがこちらです。

// lexer.pest
WHITESPACE = _{ " " | "\t" | "\r" | "\n" | "," }
COMMENT = _{ ";" ~ (!"\n" ~ ANY)* ~ "\n" }

string = @{ "\"" ~ (!"\"" ~ ANY)* ~ "\"" }
regex = @{ "#" ~ "\"" ~ (!"\"" ~ ANY)* ~ "\"" }
bool = @{ "true" | "false" }
nil = @{ "nil" }
integer = @{ ('-' | '+')? ~ ASCII_DIGIT+ }
float = @{ ('-' | '+')? ~ ASCII_DIGIT+ ~ ("." ~ ASCII_DIGIT+)? ~ ("e" ~ ('-' | '+')? ~ ASCII_DIGIT+)? | "nan" | "inf" | "-inf" | "+inf" | "-0." ~ ("0")* }
keyword = @{ ":" ~ symbol }
symbol = @{ "'" ~ (ASCII_ALPHABETIC | "_") ~ (ASCII_ALPHANUMERIC | "_" | "-" | "*")* }
list = @{ "(" ~ expr* ~ ")" }
vector = @{ "[" ~ expr* ~ "]" }
hashmap = @{ "{" ~ (expr ~ expr)* ~ "}" }
hashset = @{ "#{" ~ expr* ~ "}" }
quote = @{ "'" ~ expr }
backquote = @{ "`" ~ expr }
unquote = @{ "~" ~ expr }
unquote_splicing = @{ "~@" ~ expr }
expr = _{ COMMENT | string | regex | bool | nil | integer | float | keyword | symbol | list | vector | hashmap | hashset | quote | backquote | unquote | unquote_splicing }
program = { SOI ~ expr* ~ EOI }

pest.rs

驚くほど正確に私の意図を組んだコードを生成してくれました。Copilotは副操縦士という意味ですが、もはやメインパイロットです。これからはメンターが常にそばに居てくれるような形で開発を進めていけそうです。