Skip to content

VSCode 拡張 v0.5.0 — IBM の言語解説書と突き合わせた修正

Choose a tag to compare

@Mt-riv Mt-riv released this 11 Oct 08:59
· 5 commits to main since this release
64a442d

IBM の公式言語解説書(Enterprise PL/I for z/OS 6.2 Language Reference、SC27-8940、758 ページ)と規定を全部突き合わせ、100 件直した版です。

入れ方

gh release download vscode-v0.5.0 --repo Mt-riv/pli-engine --pattern '*.vsix'
code --install-extension pli-lang-0.5.0.vsix

VSCode の拡張ビューの「…」→ 「VSIX からのインストール」 でも入ります。

何が変わったか

全テストが緑のまま 41 件の「黙って誤る」が残っていました。 原因は 10 のかたまりに集まります。

かたまり 症状
引数の束縛 call swap(a(1),a(2)); が入れ替わらない。addr(a(2)) が a(1) を指し、addr(x) = addr(x) が常に偽
DEFINED dcl b(5) … def(a); の b(5) が a(1) を返す。書けば基底を壊す
ビット列 dcl flags bit(8) init('1'b); flags = '1'b が偽。2 & 1 が '1'B。dcl a bit(1); a=1 が '1'B
FLOAT の引数 sign(1e-30) が 0、ceil(1e-30) が 0、round(1e18,0) が落ちる
配列の展開 put list(a+b) が先頭要素だけ。b = abs(a) が全要素同じ値
GET f(5,2) で 12345 を読むと 100 倍。a(m) が古い m を見る。,5 の空フィールドで値が 1 つずれる
PICTURE ZZ9.99 に 12 が 12.00。Y が先行ゼロだけ。値 0 の抑制で固定の $ が残る
条件 ON 単位の名前が条件が起きた側で解決される。ON ERROR へ連鎖しない。SIGNAL が復帰しない
宣言の有効範囲 名前を使う文より後ろの DECLARE が無視され、先の代入が消える
そのほか BY だけの反復 DO、多段のロケータ、小数の添字、BASED の INITIAL、BIT VARYING、FLOAT BIN の精度

書けるようになった形

配列仮引数の (*)、条件式の短絡評価(if p = null() | p->bx = 0 が落ちない)、括弧なしの反復係数(3 f(8,4))、データリストの反復指定(put list((x(i) do i = 1 to 3)))、END の多重閉じ、DO LOOP / UPTHRU / DOWNTHRU、複合代入(+= ほか)、<>、中置の ¬、READ IGNORE、ALIGNED など意味を持たない属性の受け流し。

規定にあって実装しないものは名指しで断るようにしました(文 10 語・属性 13 語・式と宣言 4 形・入出力 4 形・組込サブルーチン 8 語)。組込関数の表も解説書と突き合わせ、無い 3 語を外して抜けていた 23 語を足しました(98 → 118)。

挙動が変わった 3 件

0.4.2 と結果が変わります。どれも規定のページで裏を取りました。

  1. dcl b bit(1); b = 1; が '1'B → '0'B(中間ビット列を左詰めで詰めるため)
  2. dcl a pic'ZZ9.99'; a = 12.34; が [ 12.34] → [ 0.12](尺度を決めるのは V と F だけで、. は挿入文字)
  3. signal zerodivide が終了 → 次の文へ復帰(演算で起きた計算条件は従来どおり終了)

MOD の除数が負のときの値も変わりました(mod(10,-8) が -6 → 2)。規定は非負の最小値を返すもので、以前の実装が逆向きでした。

テスト

engine 1480 件(1180 → +300)、vscode-pli 96 件。構文ごとの棚卸し(grammar.test.ts 116 件)と解説書との突き合わせ(ibm-lrm.test.ts 183 件)を新設し、後者は各テストに規定のページ番号を書いています。

vsix は CI が作ったもの(run 38126590433)をそのまま添付しています。