Skip to content

Releases

VSCode 拡張 v0.5.1 — ON 単位・構造体の引数・配列全体の代入を直す

Choose a tag to compare

@Mt-riv Mt-riv released this 09 Nov 09:09
26de274

ON 単位・構造体の引数・配列全体の代入の不具合を直した修正版です。

入れ方

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

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

何が変わったか

0.5.0 0.5.1
ON 単位の本体の名前 条件が起きた手続きの側で探す。テストで on condition(range) raised = '1'b; と置き、呼び先で signal すると、テスト側の旗が立たない ON を置いた手続きのスコープで動かす。ON 単位は呼び出しの連鎖でたどる
構造体を引数に渡す call add(game, 5); が断られる 参照渡しで渡せる。葉を宣言順に突き合わせ、項目の数・属性・次元が違えば断る
配列の引数への p = 0; 配列を作り直すので、呼び元に何も戻らない(その後の p(i) = … も含めて) 要素ごとに書くので、呼び元に戻る
構造体全体の代入(b = a)で葉の要素数が違う 黙って代入先の形を変える 断る
plitest でテストファイルが 0 件 失敗 --pass-with-no-tests で 0 で終わる

Linter は、構造体の仮引数の葉と、構造体を渡した呼び出しを正しく数えるようになりました(「代入前に読んでいる」「使っていない」の誤検出が消えます)。

直していないもの

DEFINED で重ねた配列への配列全体の代入(over = 8;)が、黙って捨てられます。

テスト

engine 1496 件(0.5.0 の 1480 から +16)、vscode-pli 96 件。直した 3 件には、元のコードで落ちる回帰テストがあります。

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

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

Choose a tag to compare

@Mt-riv Mt-riv released this 11 Oct 08:59
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)をそのまま添付しています。

VSCode 拡張 v0.4.2 — 日本語と英語で使えるようにする

Choose a tag to compare

@Mt-riv Mt-riv released this 10 Oct 14:44
981d155

日本語と英語のどちらでも使えるようにしました。 既定は日本語のままで、日本語の出力は 1 文字も変わりません。

切り替え方

入口 やり方
VSCode 設定 pli.language(auto / ja / en)。既定の auto は VSCode の表示言語に合わせます
ブラウザ版 画面上部の言語の選択(書いていた内容は残ります)
CLI --lang ja|en、または環境変数 PLI_LANG
npm run pli -- examples/tests/arith_test.pli --lang en
PLI_LANG=en npm run plitest -- examples/tests

環境の言語には追従しません。 LANG もブラウザの言語設定も見ません。同じコマンド・同じ URL が機械の設定で違う言葉を出すと、出力を固定したテストも画面の説明も成り立たなくなるためです。

VSCode のコマンド名(「PL/I: 実行」など)と設定の説明だけは VSCode 自身の仕掛け(package.nls.json / package.nls.en.json)で決まるので、VSCode の表示言語に従います。既定の auto なら両者が揃います。

何が英語になるか

実行時のメッセージ・診断・Linter の指摘・テストの報告・画面(MFS)の表示・Snippet の名前と説明・ブラウザ版のサンプル名とその中の注釈・CLI の使い方。合わせて 784 件の文字列です。

line 3: Only a pointer can be assigned to a pointer
tests 12 / passed 12 / failed 0 / errors 0 / skipped 0 / 52ms
line 2: unused is declared but not used. [unused-variable]

ついでに直した不具合

いずれも英語で動かさないと表に出ないものです。

何が起きていたか
実行時エラーの行の接頭辞 RuntimeError が 3行: をメッセージに埋め、受け取る側が正規表現で剥がしていました。接頭辞は言語で形が変わるので、英語では剥がし損ねて診断に二重に出ます。行は例外の属性から取るようにしました
ブラウザ版の大きさの検査 「素のバイト数で見る」と書きながら UTF-16 の単位で測っており、304KB を 261KB と見ていました。バイト数で測るよう直しています
engine/web/README.md 「端末」の説明が「無限ループ対策」の節に紛れていました

文書

英語版を追加しました。README.en.md / docs/en/(ブラウザ・VSCode・テスト・Linter・DL/I・MFS)/ engine/README.en.md。

どう担保しているか

訳は日本語の文そのものを鍵にして engine/src/i18n/en.ts に置き、TypeScript の構文木から鍵を集めて検査しています。m で包み忘れた日本語(差し込みの中の裸の文字列も)、訳の抜け、使われなくなった鍵、差し込みの数の不一致、そして英語で実際に走らせて英語で出ることまでテストが見ます。

既存の日本語のテストは書き換えていません。日本語のときは素の文字列連結と完全に同じものを返すので、日本語を直接見ている 167 箇所の表明がそのまま安全網になります。

engine 1174 件 / vscode-pli 96 件が緑です。

インストール

下の pli-lang-0.4.2.vsix を落として、VSCode の拡張ビュー → 右上の … → 「VSIX からのインストール」。code コマンドが使えるなら:

code --install-extension pli-lang-0.4.2.vsix

この vsix は GitHub Actions がビルドしたものです(手元のビルドは配っていません)。

VSCode 拡張 v0.4.1 — エディタから DL/I が使えなかったのを直す

Choose a tag to compare

@Mt-riv Mt-riv released this 10 Oct 13:00
14af65a

VSCode から DL/I(IMS/DB)が使えなかったのを直した版です。処理系の意味論は
v0.4.0 から変わりません。同じプログラムの出力は変わらないので、v0.4.0 で
DL/I を使っていない人は急ぐ必要はありません。

エディタだけ PSB を拾わなかった

CLI の plitest はソースの隣の *.psb を既定に使いますが、拡張は設定
pli.dli.psb しか見ていませんでした。同じファイルがコマンドラインでは通り、
エディタからは DL/I のテストが全部異常
になります。

$ npm run plitest -- examples/tests/dli_test.pli   成功 12 / 異常 0
エディタ(v0.4.0)                                  成功 0  / 異常 12

v0.4.1 では設定が優先、空ならソースの隣の *.psb(ちょうど 1 つのときだけ)を
使います。設定から来ていない PSB を使ったときは、どれを使ったかを出力の先頭に
出します(黙って拾うと、同じソースが置き場所で挙動を変える理由が分かりません)。

DL/I の PSB: STUPSB(ソースの隣から)
--- /path/to/dli_test.pli ---
  OK   TEST_GN_READS_ALL_IN_HIERARCHIC_ORDER (9ms)

PSB が無いときの報告が的外れだった

proc(io_ptr, db_ptr) options(main) の引数は、PSB が無いとコマンドライン引数
(文字列)になります。それが DCL (io_ptr, db_ptr) POINTER; に来ていました。

v0.4.0 stuprt.pli:11: ポインタにはポインタしか代入できません
v0.4.1 stuprt.pli:9: 主手続きの引数 io_ptr, db_ptr はポインタで宣言されています。PCB を受け取る IMS のプログラムなので、実行するときに PSB の名前を与えてください

指していた行(宣言)も理由も違うので、足りないものが PSB の指定だとは
分かりませんでした。CALL PLITDLI に達する前、引数を束縛する時点で断ります。

その他の修正

  • 設定 pli.dli.psb が IMS の名前として使えないとき、警告は「DL/I は無効に
    します」と言うのに隣の PSB で動いてしまう状態を直しました。書き間違いが
    見つからなくなるので、隣へは落としません
  • my-psb.psb のように IMS の名前になれない *.psb が 1 つあるだけで
    「PSB 名 my-psb は IMS の名前として使えません」で止まっていたのを直しました

画面入出力(MFS)の例を同梱

これまで .mfs と .keys はテスト用の置き場所にしかなく、そこは PSB を
別形式で束ねているため、PL/I: 画面を動かす(MFS) を試す手段がリポジトリに
存在しませんでした
。engine/examples/screen/ を追加しています。

engine/examples/screen/
  dbinq.pli    在庫照会。画面(MFS)とデータベース(DL/I)を 1 本で使う
  dbinq.mfs    書式定義(MID / MOD / DIF / DOF)
  dbinq.keys   端末の台本
  INVPSB.psb   先頭が入出力 PCB、2 つめが ITEM の DB PCB
  ITEM.dbd / ITEM.dat

dbinq.pli を開いてコマンドを実行すれば、設定を触らずに動きます。

なぜ見つからなかったか

  • extension.ts(503 行)が 1 行も実行されていませんでした。vscode を
    import するのでテストから読めず、設定を読んで実行オプションを組み立てる
    部分がまるごと外にありました。この判断を core.ts の choosePsb() へ
    出し、テストで固定しています
  • 「隣の .psb を使う」規則が 3 箇所に手書きで複製されていました。
    テストが自前のコピーを持っていたため、テストは実装を検証していません
    でした。1 箇所にまとめています
  • examples/dli/stuprt.pli は lint されるだけで一度も実行されていません
    でした。examples/ の 3 ディレクトリ全部を常用のテストで走らせるように
    しています

インストール

gh release download vscode-v0.4.1 --repo Mt-riv/pli-engine
code --install-extension pli-lang-0.4.1.vsix

.vsix は CI がビルドしたものです(手元でビルドしたバイナリは配りません)。

VSCode 拡張 v0.4.0 — 画面入出力(MFS)と総点検の修正

Choose a tag to compare

@Mt-riv Mt-riv released this 10 Oct 11:21
4533f8a

**3270 の画面入出力(MFS)**が入り、総点検と実機との突き合わせで見つかった
誤りを直した版です。v0.3.0 から同じプログラムの出力が変わります。

拡張は処理系を同梱しているので、下の修正はすべてこの .vsix に入ります。

v0.3.0 のブラウザ版(dist-web/index.html)は壊れていました。
.vsix は無事ですが、v0.3.0 のタグから自分でビルドした単一 HTML は
開いても何も起きません。0.4.0 で直っています(下の「ブラウザ版の修復」)。

画面入出力(MFS)

FMT / MSG の書式定義から MID / MOD / DIF / DOF を組み、3270 の画面を扱えます。
コマンド PL/I: 画面を動かす(MFS) を追加しました。書式定義 *.mfs と
台本 *.keys をソースと同じ場所から読み、画面像を出力パネルに出します。

INVFMT   FMT
         DEV   TYPE=3270-A2,FEAT=IGNORE
         DIV   TYPE=INOUT
         DPAGE CURSOR=((5,20))
         DFLD  'ITEM NO:',POS=(5,10),ATTR=(ALPHA,PROT)
ITEMIN   DFLD  POS=(5,20),LTH=6,ATTR=(NUM,NOPROT,HI)
NAMEOUT  DFLD  POS=(7,20),LTH=20,ATTR=(ALPHA,PROT)
         FMTEND

1 回の入力 = 1 回のプログラム実行です。実機の MPP と同じで、GU で
キューの次を取り、処理し、ISRT で返し、キューが空なら QC で終わります。
属性バイトが 1 つ前の位置を食う規則、変更の印(MDT)と read modified、
JUST / FILL、PF キーの固定文字、会話型(SPA)、/FORMAT を再現します。

本物の 3270 データストリームは作りません。IMS は z/OS 専用で突き合わせる
実機が無く、確かめる手段が無いものを byte 単位で固めると、間違った値を
固めても気づけないためです。書き方は docs/mfs.md。

ブラウザ版の修復

v0.3.0 の単一 HTML は開いても何も起きませんでした。String.replace に
文字列を渡していたため、置換文字列の中の $` が「一致より前の文字列全部」と
解釈され、圧縮後のコードに当たって HTML 全体がもう一度差し込まれていました
(<html> が 5 個、スクリプトは構文誤り)。

CI の順序も直しました。ブラウザ版のテストは成果物が無いとまるごと省略される
作りで、ビルドがテストの後ろにあったため単一 HTML の検査が一度も
走っていませんでした
。これが見逃した理由です。

出力が変わる修正

v0.3.0 v0.4.0
if i = '12'(i は FIXED BIN(15) の 12) 偽 真(文字を算術に変換して代数比較)
PIC'ZZV.ZZ' に 0 .00 (桁がすべて抑制できるなら欄全体)
mod(7, 2.5) 2.0 2.0(基数を揃えるようにした。mod(i,0.5) などが直る)
divide(a,b,5,4)(a は DEC(15,0)) 0.0000 0.5000
round(15, -1) 2 20
trunc(1.23456) の幅 9 5(CEIL / FLOOR と同じ)
put edit('A')(skip, a(1)) を続ける 余分な空行が入る 入らない
a = 0.001 のとき a*a*a > 0 偽 真
put list(1.5e3) 1500 1.50000E+0003(指数付き定数は浮動小数点定数)

これまで通っていたものが止まります

どれも黙って嘘を返していた経路です。

書いたもの v0.3.0 v0.4.0
dcl inp file stream input; put file(inp) list('X'); 実ファイルを上書き(診断 0 件) UNDEFINEDFILE
read file(f) into(rec)(rec は BASED 構造体) 何も読まず、レコードを 1 件捨てる 正しく読める
dcl x fixed bin(31); x(7) = 42; 通る(x(99) も 42) 「x は配列ではありません」
dcl 1 tbl(3), 2 nm char(4); 通って 1 個の箱になる 「構造体の配列は未実装です」
leave outer;(入れ子のループ) 内側しか抜けない 外側まで抜ける
DFLD POS=(1,2),LTH=5, ATTR=(…) ATTR= が黙って消える 誤りとして断る

実機との突き合わせ

保留していた点を実在の PL/I 処理系で測りました。2 つ間違っていて、
3 つは合っていました。

  • 算術と文字の比較と、PICTURE の 0 の抑制はこの処理系が誤りでした
  • FIXED BIN(p,q) への 10 進代入の二段変換、TRUNC の精度、DIVIDE は一致
  • MOD の小数・負の除数は実機が壊れていたので、IBM の定義に従いました

ゴールデンは 15 → 20 件。根拠は engine/README.md。

そのほか

  • ブラウザ版に DOM-XSS がありました。 端末の通知文にプログラムが決めた
    文字列(ISRT の MOD 名など)が未エスケープで入っていました
  • Linter を 1 規則追加(16 規則)。on-never-raised は、この処理系が
    起こさない条件に ON 単位を置いたときに指摘します。
    mixed-base-arithmetic が説明どおりの形を拾えていなかったのも直しました
  • 組込関数の名指しを 77 → 99 語に。CHAR(x) が「未知の関数」に
    なっていました(綴り間違いと未実装が区別できない状態)
  • テスト 905 → 1128 件。「2 つの経路が常に一致する」ことを確かめる
    不変量の層を足しました

入れ方

gh release download vscode-v0.4.0 --repo Mt-riv/pli-engine
code --install-extension pli-lang-0.4.0.vsix

.vsix は手元ではなく CI で作っています(検証手段なしでバイナリを配らないため)。

VSCode 拡張 v0.3.0 — 実機と突き合わせた修正

Choose a tag to compare

@Mt-riv Mt-riv released this 10 Oct 04:50

⚠ この版のブラウザ版は動きません

添付の .vsix(VSCode 拡張)は無事です。 壊れていたのは、この版の
タグから自分でビルドする単一 HTML のブラウザ版(dist-web/index.html)で、
開いても何も起きません。

原因は単一 HTML への埋め込みで String.replace に文字列を渡していたことです。
置換文字列の中の $` が「一致より前の文字列全部」と解釈され、
圧縮後のコードに現れる記号に当たって HTML 全体がもう一度差し込まれて
いました(<html> が 5 個になり、スクリプトが構文誤りになる)。

CI も見逃していました。ブラウザ版のテストは成果物が無いとまるごと省略される
作りで、ビルドがテストの後ろに置かれていたため、単一 HTML の検査が
一度も走っていませんでした
。

v0.4.0
で直っています。
ブラウザ版を使うならそちらを取ってください。


実在の PL/I 処理系の出力と突き合わせて、処理系の誤りを直した版です。
v0.2.0 から同じプログラムの出力が変わる修正が入っています。

拡張は処理系を同梱しているので、下の修正はすべてこの .vsix に入ります。

セキュリティ

  • ワークスペースの外への読み書きを止めました。 TITLE('../outside/...') で
    ワークスペース外のファイルを読み書きできる状態でした。拡張はワークスペースの
    %INCLUDE 先と入出力ファイルを読み書きするので、ここが境界になります
  • 出力量・記憶域・ALLOCATE の回数の上限を全経路に効かせました(WRITE が
    上限を無視していました)

出力が変わる修正

v0.2.0 v0.3.0
put edit(1.26)(f(6,1)) 1.2 1.3(0 から遠い側へ丸める)
put edit(1.99)(f(4)) 1.99 2(小数部の指定が無ければ 0 桁として丸める)
round(12.5, 3) 12.5 12.500(尺度が n に揃う)
2**10 1024 1.0E+0003(規定の精度が最大精度を超えるので FLOAT)
i * 0.1(i は FIXED BIN) 四捨五入 0 方向へ切り捨て
改行の無いレコードファイル 全体を 1 レコードと見る RECSIZE ごとに切る
GET LIST で入力が足りないとき ENDFILE 1 回・読めた値も捨てる 2 回・読めた値は代入される

どれも推測ではなく、実在の処理系の出力と突き合わせて決めています
(engine/test/golden/ に 15 件をバイト一致で固定。根拠は
engine/README.md の「実機と突き合わせて決めたこと」)。

直した誤り(抜粋)

  • 構造体の代入が黙って失敗する(b = a が何も起きない)。
    put list(構造体) が 0 になる、oncode や date() が 0 になるのも同じ原因
  • 2 つ目以降のラベルへ GOTO すると異常終了する
  • 基数混在で小数が消える(i * 1.5 が 10、i = 10.5 が真)
  • STATIC が効かない、PICTURE の小数点、動的スコープ、ビット演算、
    16 進リテラル、CHAR VARYING の最大長、参照渡し、RETURNS の適用
  • ZERODIVIDE / SELECT の不一致 / SUBSCRIPTRANGE / CONVERSION が
    条件として上がらない
  • 未実装の組込関数が黙って 0 を返す(77 語を名指しで断るようにしました)

拡張の変更

  • テストの失敗・異常をその行に印として出します(出力パネルだけでなく)。
    失敗した表明の行を指し、--xml にも file / line が入ります
  • 文法の「未実装の組込関数」の色付けを処理系の一覧と機械で突き合わせました
  • 信頼していないワークスペースでは動かないことを宣言(ファイルを読み書きするため)
  • pli.dli.psb の値の検査、字下げの誤り(put list('do it'); で増える)、LICENSE の追加

DL/I(IMS/DB)

複数レベルの GU が先頭の親で止まる、SENSEG が走査に効かない、
ISRT が全パス SSA を要求して定番形が通らない、構造体の SSA が通らない、
といった誤りを直しました。

入れ方

gh release download vscode-v0.3.0 --repo Mt-riv/pli-engine
code --install-extension pli-lang-0.3.0.vsix

VSCode の拡張ビューの ... → 「VSIX からのインストール」 でも入ります。
手順は docs/vscode-manual.md。

確認

この .vsix は GitHub Actions が main(0969675)から作ったものです。
型検査・905 件のテスト・PL/I で書いたテスト・Linter・ブラウザ版のビルド・
出荷物の脆弱性検査を通しています。

VSCode 拡張 v0.2.0 — IMS/DB(DL/I)対応

Choose a tag to compare

@Mt-riv Mt-riv released this 10 Oct 00:05

Warning

この版は使わないでください。v0.3.0 に上げてください。

  • TITLE('../outside/...') でワークスペースの外のファイルを読み書きできます(v0.3.0 で境界を入れました)
  • 構造体の代入が黙って失敗する、2 つ目以降のラベルへの GOTO で異常終了する、
    基数混在で小数が消えるなど、処理系の誤りが残っています
  • 書式と精度の一部が実在の処理系と違います(v0.3.0 で突き合わせて直しました)

PL/I から CALL PLITDLI で**階層型データベース(IMS/DB)**を読み書きできるようになりました。
IMS のインストールは要りません。DBD・PSB・データはテキストファイルです。

入れたもの

呼び出し GU GN GNP とホールド付き(GHU GHN GHNP)、ISRT REPL DLET
SSA 無修飾・修飾(関係演算子 12 種、AND / OR)・複数レベル・コマンドコード C D F L P U V
PCB 規定 9 項目、セグメント名・レベル・キーフィードバック
ステータスコード 空白 GA GB GE GK GP II DJ DA AC AD AJ AM LB LC LD LE
定義 DBDGEN / PSBGEN のサブセット、PROCOPT の強制、ロードモード
Linter 規則 dli-status-unchecked を追加(DL/I は失敗しても例外を出さない)
Snippet DL/I 用 5 本(pcb / dlifunc / dligu / dlign / dlirepl)
設定 pli.dli.psb(使う PSB の名前。空なら DL/I を使わない)

VSCode でファイル入出力が動くようになりました。 これまで拡張のホストに
openFile が無く、OPEN / READ / WRITE が動いていませんでした(既存の欠落)。

入れていないもの

物理層(HDAM / HIDAM の違い、RAP、ポインタ、OSAM)、二次索引、論理関係、
IMS TM / DC、EXEC DLI、AIB インタフェース、同期点(CHKP / ROLB)。
再現するのは論理層だけです。当たったら何が未実装かを名指しで報告します。

入れ方

拡張ビューの … →「VSIX からのインストール」で pli-lang-0.2.0.vsix を選びます。

code --install-extension pli-lang-0.2.0.vsix --force

入れ直したら VSCode を再読み込みしてください。

使い方

設定 pli.dli.psb に PSB の名前を入れます(例: STUPSB)。空のままだと
CALL PLITDLI は「PSB が指定されていません」で止まります。DBD・PSB・データは
ソースと同じディレクトリかワークスペース直下から <名前>.dbd / <名前>.psb /
<DBD 名>.dat として読みます。

書き方は docs/dli.md。

検証

npm test が engine 694 件 / 拡張 53 件(v0.1.0 時点は 563 件 / 48 件)。
PL/I で書いたテストが別に 39 件。

出力書式や精度規則は実在の PL/I 処理系と突き合わせて決めていますが、
IMS/DB だけは突き合わせる相手がありません(IMS は z/OS 専用)。
DL/I は IBM の仕様文書を正とし、各ステータスコードの意味をテストのコメントに
引用して担保しています。

VSCode 拡張 v0.1.0

Choose a tag to compare

@Mt-riv Mt-riv released this 09 Oct 16:05

PL/I を VSCode の中で書いて動かす拡張です。処理系を同梱しているので、
外部のコンパイラは要りません。

インストール

  1. 下の pli-lang-0.1.0.vsix をダウンロード
  2. 拡張ビュー(Ctrl+Shift+X / Cmd+Shift+X)→ 右上の … → 「VSIX からのインストール」
  3. Developer: Reload Window で読み込み直す

code コマンドが使えるなら code --install-extension pli-lang-0.1.0.vsix でも入ります。

できること

機能 操作
実行 PL/I: 実行(Ctrl+Alt+R / Cmd+Alt+R)
引数付き実行 PL/I: 引数を指定して実行
テスト PL/I: テストを実行(Ctrl+Alt+T / Cmd+Alt+T)
構文強調 自動(キーワード 133 語、組込関数 98 語)
診断 入力中に自動。問題タブに行・桁付きで表示
Linter 入力中に 13 規則で検査。規則 id 付きなので設定で個別に切れる
Snippet 38 本(main dow getlist node など)

対応する拡張子: .pli .pl1 .plinc .inc .cpy

対応している PL/I の範囲

手続き(入れ子・再帰・引数・戻り値)、構造体、配列、DEFINED + iSUB、
ON 単位と条件、PUT/GET の LIST と EDIT、ストリーム入出力、
%INCLUDE、PICTURE、BASED 記憶域とポインタ、レコード入出力、
組込関数 21 種、%REPLACE。

10 進固定小数点を正確に扱います(123.45 * 6.7 が誤差なく 827.115)。

必要なもの

VSCode 1.90 以上。それ以外は不要です。

制限

PL/I のサブセットです。索引・直接編成ファイル(KEYED / REGIONAL)、
AREA / OFFSET、REFER、UNION、LABEL 変数、多重処理
(TASK / WAIT / EVENT)は実装していません。未実装の機能に当たると、
何が未実装かを名指しで報告します。

ポインタはアドレス値を持たず、確保した記憶域への参照として扱います。
ポインタ算術はできませんが、NULL・解放済み・二重解放は必ず検出します。

使い方の詳細は docs/vscode-manual.md、Linter の規則は docs/lint.md、
テストの書き方は docs/test.md にあります。