科学技術計算用プログラミング言語:Sci-Lispの自作(11日目):GitHub Copilotの威力
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 }
驚くほど正確に私の意図を組んだコードを生成してくれました。Copilotは副操縦士という意味ですが、もはやメインパイロットです。これからはメンターが常にそばに居てくれるような形で開発を進めていけそうです。