Repository navigation
Releases
VSCode 拡張 v0.5.1 — ON 単位・構造体の引数・配列全体の代入を直す
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 の言語解説書と突き合わせた修正
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)をそのまま添付しています。
VSCode 拡張 v0.4.2 — 日本語と英語で使えるようにする
日本語と英語のどちらでも使えるようにしました。 既定は日本語のままで、日本語の出力は 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 が使えなかったのを直す
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)と総点検の修正
**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 — 実機と突き合わせた修正
⚠ この版のブラウザ版は動きません
添付の
.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.vsixVSCode の拡張ビューの ... → 「VSIX からのインストール」 でも入ります。
手順は docs/vscode-manual.md。
確認
この .vsix は GitHub Actions が main(0969675)から作ったものです。
型検査・905 件のテスト・PL/I で書いたテスト・Linter・ブラウザ版のビルド・
出荷物の脆弱性検査を通しています。
VSCode 拡張 v0.2.0 — IMS/DB(DL/I)対応
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
PL/I を VSCode の中で書いて動かす拡張です。処理系を同梱しているので、
外部のコンパイラは要りません。
インストール
- 下の
pli-lang-0.1.0.vsixをダウンロード - 拡張ビュー(
Ctrl+Shift+X/Cmd+Shift+X)→ 右上の…→ 「VSIX からのインストール」 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 にあります。