Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: ジャンプ文の挙動を変更 #844

Merged
merged 15 commits into from
Nov 13, 2024

Conversation

takejohn
Copy link
Contributor

@takejohn takejohn commented Nov 5, 2024

What

return, break, continue文の挙動を変更します。
unreleased/jump-statements.mdの内容 (#840 で書き換えられる可能性あり):

  • return文は関数スコープ内でないと文法エラーになります。
  • break文およびcontinue文は反復処理文(for, each, while, do-while, loop)のスコープ内でないと文法エラーになります。
  • return文は常に関数から脱出します。
  • break文は常に最も内側の反復処理文の処理を中断し、ループから脱出します。
  • continue文は常に最も内側の反復処理文の処理を中断し、ループの先頭に戻ります。

Why

Additional info (optional)

  • VReturn, VBreak, VContinueValueの下位型から外し、Control型として扱うことにします。また、名前をそれぞれCReturn, CBreak, CContinueに変更します。
    インタプリタの一部メソッドはValue | Controlを返すようにし、関数やループ処理以外のメソッドは呼び出し関数がControlを返すとそれをそのまま返値とすることでControlを呼び出し元へ伝播します。
    例:
    const value = await this._eval(valueExpr, scope, callStack);
    if (isControl(value)) {
    	return value;
    }
    // ...
  • パーサのプラグインによって、関数外にreturn文、ループ構文外にbreak文やcontinue文があると文法エラーを出すようにします。
    ASTを走査する際に先祖ノードの情報が必要となるため、visitNode関数が引数の関数に先祖ノードの配列も渡すようにします。
  • 配列リテラルやオブジェクトリテラル、実引数リストは要素を順次実行し、最初にControlが返ってくると処理を終了します。
  • テストファイルjump-statements.tsを追加しました。ブロックにラベルを付けて指定したブロックから脱出できるようにする #840 に関するテストもここに入る予定です。

@codecov-commenter
Copy link

codecov-commenter commented Nov 5, 2024

⚠️ Please install the 'codecov app svg image' to ensure uploads and comments are reliably processed by Codecov.

Codecov Report

Attention: Patch coverage is 98.56322% with 5 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
src/interpreter/control.ts 90.90% 5 Missing ⚠️

❗ Your organization needs to install the Codecov GitHub app to enable full functionality.

Files with missing lines Coverage Δ
src/interpreter/index.ts 95.76% <100.00%> (+9.96%) ⬆️
src/interpreter/reference.ts 95.74% <100.00%> (ø)
src/interpreter/value.ts 100.00% <ø> (ø)
src/parser/index.ts 76.00% <100.00%> (-4.89%) ⬇️
src/parser/plugins/validate-jump-statements.ts 100.00% <100.00%> (ø)
src/parser/visit.ts 100.00% <100.00%> (+5.26%) ⬆️
src/interpreter/control.ts 90.90% <90.90%> (ø)

... and 26 files with indirect coverage changes

Copy link
Collaborator

@syuilo syuilo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

YOSASOU

test/jump-statements.ts Outdated Show resolved Hide resolved
@takejohn takejohn marked this pull request as draft November 5, 2024 16:01
@takejohn takejohn marked this pull request as ready for review November 9, 2024 08:26
@takejohn takejohn merged commit dff363b into aiscript-dev:master Nov 13, 2024
4 checks passed
@takejohn takejohn deleted the fix/jump-out-from-expression branch November 13, 2024 03:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
4 participants