Repository navigation
VSCode 拡張 v0.5.0 — IBM の言語解説書と突き合わせた修正
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 と結果が変わります。どれも規定のページで裏を取りました。
dcl b bit(1); b = 1;が'1'B→'0'B(中間ビット列を左詰めで詰めるため)dcl a pic'ZZ9.99'; a = 12.34;が[ 12.34]→[ 0.12](尺度を決めるのはVとFだけで、.は挿入文字)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)をそのまま添付しています。