Skip to content

Commit c7c0200

Browse files
ponapaltclaude
andcommitted
ShioriLint に if などの枝の処理・変数名の空白・乱数の書式の検査を追記 Mc206-3
🌹 Polished by Claudia Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 17162f5 commit c7c0200

2 files changed

Lines changed: 14 additions & 0 deletions

File tree

‎other/unicode-changes.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ ACP 版にはなかった機能です。
6363

6464
- 辞書を実行せずに検査する `ShioriLint`(Mc206-1以降)。存在しない `>` の飛び先、閉じていない `(`、計算式の誤りなどを、結果を `ErrorLevel` / `ErrorDescription` で返します([辞書の静的検査](../shiori/lint.md))。
6565
- さとりてで `ShioriLint` を実行できます(Mc206-2以降)。「検査」ボタンと、ダイアログを出さない `satorite.exe --lint`(エラーがあれば終了コード 1)です([さとりてから実行する](../shiori/lint.md#さとりてから実行する))。あわせて、さとりてのウィンドウの大きさを変えられるようになり、位置と大きさを `satorite.dat` に保存します([さとりて](../shiori/debug.md#さとりて))。
66+
- `ShioriLint` が、`if` などの枝にある処理、変数名の前後の空白、乱数の指定の誤りも見つけます(Mc206-3以降)。`if` `unless` `iflist` `switch` `nswitch` `choice` は引数を先に展開するので、枝に `set` や `$` の行のある文の呼び出しがあると、選ばれなかった枝でも実行されます。[辞書の静的検査](../shiori/lint.md)に、見つけ方と直し方を書きました。
6667

6768
### システム変数
6869

‎shiori/lint.md‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,10 +116,19 @@ ErrorDescription: dic_a.txt(3) : warning: 「存在しない名前」は、単
116116
| `(` を閉じ忘れた疑い(続きの行が `*` か `@` で始まっている) | `( が閉じられていない可能性があります(続きの行が*か@で始まっています)` |
117117
| ファイルの最後が `φ` | `ファイルの最後がφで終わっています` |
118118
| `()` が深すぎる(200 段を超える) | `()の入れ子が深すぎるので、これより内側は調べません` |
119+
| `if` `unless` `iflist` `switch` `nswitch` `choice` の枝に、変数や単語を書き換える処理がある(Mc206-3以降) | `「if」は引数を先に展開するので、選ばれなかった枝も実行されます。枝に(set)があります。片方だけ実行したいときは、when か whenlist を使ってください` |
120+
| 変数名の前か後ろに空白がある(Mc206-3以降) | `変数名「名前 」の前か後ろに空白があります。空白も含めた名前で登録されるので、空白なしの名前では読めません…` |
121+
| `(乱数…)` の指定が変(`~` が 1 つでない。Mc206-3以降) | `「乱数~1」は、乱数の指定が変です。「(乱数1~6)」のように、~を 1 つだけ書きます` |
119122

120123
- 「`(笑)` のような、文字として表示したい `(` `)`」は、実行時には名前の検索に失敗して、そのまま表示されます。lint はこれを「見つからない名前」として警告します。表示のつもりなら `φ(笑)` と書くと、警告も実行時の `not found` ログも出なくなります。
121124
- `ID` が `On` で始まる、`http` で始まる、`:` を含む(`script:` など)選択肢の飛び先は、イベントや URL として使われるので調べません。`OnChoiceSelect` を定義しているときも調べません。
122125
- `\q[ラベル,ID,…]` は 2 つ目、`\__q[ID,…]` は 1 つ目を ID として読みます。`"…"` で括ったラベルの中の `,` や、`\]` は区切りとして扱いません。`\\q[…]` のようにバックスラッシュを重ねたものはタグとして扱いません。ID に `()` を含むときは調べません。
126+
- **`if` などの枝の処理**(Mc206-3以降):`if` `unless` `iflist` `switch` `nswitch` `choice` は ssu の関数で、特殊形式の [when](../functions/when.md) と違い、引数の `()` を先に全部展開します。このため、枝に変数や単語を書き換える処理があると、選ばれなかった枝でも実行されます(例:`(if、(R0)<=99、(set、満充電、0))` は、R0 がいくつでも `満充電` を 0 にします)。片方だけ実行したいときは `when` か `whenlist` を使います([if](../ssu/if.md))。
127+
- 処理とみなすのは、`set` `変数の一括削除` `変数の一括コピー` `split_to` `単語の追加` `追加単語の削除` `追加単語の全削除` と、本文に `$` の行(または上の処理)がある文を `(call、名前)` `(loop、名前、…)` `(vncall、名前)` `(名前)` で呼ぶことです。値を返すだけの文を呼ぶものは報告しません。
128+
- 枝として調べるのは、`if` `unless` `nswitch` は条件(先頭の引数)を除いたすべて、`iflist` `switch` は結果(と末尾の「それ以外」)、`choice` はすべての候補です。条件や比べる値の中の処理は、どの枝が選ばれても実行されるので報告しません。`when` などの特殊形式の引数の中は、条件によって実行されないことがあるので数えません。
129+
- 呼ぶ名前に同じ名前の `@` があるときは、単語群として読まれ、どの単語が選ばれるか分からないので数えません。
130+
- **変数名の空白**(Mc206-3以降):`$名前 =1`、`$名前 【タブ】値`、`(set、 名前、値)` のように、名前の前か後ろに空白(半角・全角)があると、空白も含めた名前で登録されます。`(名前)` では読めません。空白だけの名前(`$ 【タブ】` で空文字列の定数にする書き方)は、意図したものとして報告しません。
131+
- **`(乱数…)` の指定**(Mc206-3以降):実行時と同じ分け方で、区切りの `~` が 1 つでない `(乱数…)` を報告します(実行すると `※ 乱数の指定が変です ※` と表示されます)。
123132

124133
### notice
125134

@@ -130,11 +139,15 @@ ErrorDescription: dic_a.txt(3) : warning: 「存在しない名前」は、単
130139
| `(名前)` の名前が見つからないが、実行時に名前が決まる変数などを作る記述が辞書にある | `「名前」は、単語群・文・変数・内蔵関数・SAORIのどれにも見つかりません。(実行時に名前が決まる変数や単語群を作る記述があるので、あるのかもしれません)…` |
131140
| `(` に対応しない `)` | `対応する ( が無い ) があります。文字としてそのまま表示されます` |
132141
| 行頭が半角の `*` `@` `$` | `行頭が半角の「*」です。この行は文の本文として扱われます(…)` |
142+
| `(set、名前、…)` の名前が、単語群や文と同じ(Mc206-3以降) | `変数「名前」と同じ名前の単語群か文があります。トラブルの元なので避けましょう` |
143+
| タブ区切りの代入が、自分自身に演算子をつないでいる(`$回数【タブ】(回数)-1`。Mc206-3以降) | `タブ区切りの代入は計算せず、式を文字列として入れます。自分自身を含むので、実行のたびに式が長くなっていきます…` |
133144

134145
- 飛び先の無い `>` は、実行しても、ログに `not found` と出て続きを実行するだけです。ひな形が用意する任意のフック(`>他のゴーストから変更` など、定義するかどうかは作者しだい)として使われることが多いので、`error` にしていません。名前の書き間違い(末尾の空白など)は、上の warning で見つかります。
135146
- `>` の飛び先は、空(ランダムトーク)と `OnTalk` は存在しなくても報告しません。`≫` `≧` は検索なので調べません。飛び先に `()` を含むとき(実行時に決まるとき)も調べません。
136147
- `1)りんご` `a)` のように、`)` の直前が数字か英字のときは、箇条書きの番号とみなして報告しません。`φ(……)` のように、`φ(` で表示するつもりの `(` と対になる `)` も報告しません。
137148
- 辞書の中に `$(名前)=…` `split_to` `単語の追加` のような、実行時に名前が決まる変数や単語群を作る記述があると、見つからない名前は notice になります(変数は辞書を読むだけでは無いと言い切れないため)。
149+
- タブ区切りの代入(`$回数【タブ】(回数)-1`)は式を計算せず、式の文字列をそのまま入れます(`5-1` のようになり、実行のたびに長くなります)。計算に使うときに式として評価されるので動いてしまい、そう書いている辞書も多いため、notice にとどめます。計算した数を入れたいときは `$回数=(回数)-1` と書きます。自分自身を含まない形(`$名前【タブ】(x)+1`)は、表示する文字(`[(x)/3]` など)と区別できないので調べません。
150+
- `(set、名前、…)` の名前が単語群や文と同じ場合は、生成した名前に set する辞書などで数が多くなりやすいので、`$` の行(warning)より軽く notice にしています。
138151

139152
## 名前の探し方(`(名前)` の警告)
140153

0 commit comments

Comments
 (0)