Skip to content

Commit

Permalink
parseDestで置き換え
Browse files Browse the repository at this point in the history
  • Loading branch information
uzmoi committed Sep 1, 2024
1 parent 02c2941 commit 364e505
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 26 deletions.
30 changes: 19 additions & 11 deletions src/parser/syntaxes/common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,24 @@ import type * as Ast from '../../node.js';

/**
* ```abnf
* Params = "(" [IDENT [":" Type] *(SEP IDENT [":" Type])] ")"
* Dest = IDENT / Expr
* ```
*/
export function parseDest(s: ITokenStream): Ast.Expression {
// 全部parseExprに任せるとparseReferenceが型注釈を巻き込んでパースしてしまうためIdentifierのみ個別に処理。
if (s.is(TokenKind.Identifier)) {
const nameStartPos = s.getPos();
const name = s.getTokenValue();
s.next();
return NODE('identifier', { name }, nameStartPos, s.getPos());
} else {
return parseExpr(s, false);
}
}

/**
* ```abnf
* Params = "(" [Dest [":" Type] *(SEP Dest [":" Type])] ")"
* ```
*/
export function parseParams(s: ITokenStream): Ast.Fn['args'] {
Expand All @@ -23,16 +40,7 @@ export function parseParams(s: ITokenStream): Ast.Fn['args'] {
}

while (!s.is(TokenKind.CloseParen)) {
let dest: Ast.Expression;
// 全部parseExprに任せるとparseReferenceが型注釈を巻き込んでパースしてしまうためIdentifierのみ個別に処理。
if (s.is(TokenKind.Identifier)) {
const nameStartPos = s.getPos();
const name = s.getTokenValue();
s.next();
dest = NODE('identifier', { name }, nameStartPos, s.getPos());
} else {
dest = parseExpr(s, false);
}
const dest = parseDest(s);

let optional = false;
let defaultExpr: Ast.Expression | undefined;
Expand Down
21 changes: 6 additions & 15 deletions src/parser/syntaxes/statements.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { AiScriptSyntaxError } from '../../error.js';
import { CALL_NODE, NODE } from '../utils.js';
import { TokenKind } from '../token.js';
import { parseBlock, parseParams, parseType } from './common.js';
import { parseBlock, parseDest, parseParams, parseType } from './common.js';
import { parseExpr } from './expressions.js';

import type * as Ast from '../../node.js';
Expand Down Expand Up @@ -100,7 +100,7 @@ export function parseBlockOrStatement(s: ITokenStream): Ast.Statement | Ast.Expr

/**
* ```abnf
* VarDef = ("let" / "var") (IDENT / Expr) [":" Type] "=" Expr
* VarDef = ("let" / "var") Dest [":" Type] "=" Expr
* ```
*/
function parseVarDef(s: ITokenStream): Ast.Definition {
Expand All @@ -122,16 +122,7 @@ function parseVarDef(s: ITokenStream): Ast.Definition {
}
s.next();

let dest: Ast.Expression;
// 全部parseExprに任せるとparseReferenceが型注釈を巻き込んでパースしてしまうためIdentifierのみ個別に処理。
if (s.is(TokenKind.Identifier)) {
const nameStartPos = s.getPos();
const name = s.getTokenValue();
s.next();
dest = NODE('identifier', { name }, nameStartPos, s.getPos());
} else {
dest = parseExpr(s, false);
}
const dest = parseDest(s);

let type: Ast.TypeSource | undefined;
if (s.is(TokenKind.Colon)) {
Expand Down Expand Up @@ -209,8 +200,8 @@ function parseOut(s: ITokenStream): Ast.Call {

/**
* ```abnf
* Each = "each" "(" "let" Expr "," Expr ")" BlockOrStatement
* / "each" "let" Expr "," Expr BlockOrStatement
* Each = "each" "(" "let" Dest "," Expr ")" BlockOrStatement
* / "each" "let" Dest "," Expr BlockOrStatement
* ```
*/
function parseEach(s: ITokenStream): Ast.Each {
Expand All @@ -228,7 +219,7 @@ function parseEach(s: ITokenStream): Ast.Each {
s.expect(TokenKind.LetKeyword);
s.next();

const dest = parseExpr(s, false);
const dest = parseDest(s);

if (s.is(TokenKind.Comma)) {
s.next();
Expand Down

0 comments on commit 364e505

Please sign in to comment.