Chapter 10

構文解析

takl
takl
2020.12.22に更新

今回は、たとえば "(foo 1 2)"

{
  kind: "array",
  firstToken: ...,
  lastToken: ...,
  data: [
    { kind: "variable", text: "foo", fisrtToken: ..., lastToken, ... },
    { kind: "number", value: 1, firstToken: ..., lastToken, ...  },
    { kind: "number", value: 2, lastToken: ..., lastToken, ...  }
  ]
}

のように変換します。ポイントは全てのノードに firstTokenlastToken を持たせておくことです。これによりカーソル位置からノードを検索できるようになります。

まだ defun などは扱いません。

(...) が list でなくて array なのは Lisp 的にはおかしいのですが、 improper list もありませんし、array の方が JavaScript 的に扱いやすいのでそうしました。

実装はこちらです。

括弧の対応が合わないときにグローバル変数 diagnostics に診断メッセージを追加します1, 2。これで括弧の対応がおかしいとき、診断メッセージが表示されます。

呼び出しコードはこうです。

oreore.js
function compile(uri, src) {
    diagnostics.length = 0;
    const tokens = tokenize(uri, src);
    const pts = parse(tokens.filter(t => t.kind !== "comment"));
    buffers[uri] = { tokens };
}

さすがに構文解析に comment は邪魔なので、トークン列を parse に渡す前に comment を捨てます。

* ここまでのソースコード *