pub struct Parser {
toks: Vec<Token>,
pos: usize,
errors: Vec<ParseError>,
error_count: usize,
}Fields§
§toks: Vec<Token>§pos: usize§errors: Vec<ParseError>回復して解析を続けた構文エラーの記録(上限 MAX_RECORDED_ERRORS 件)。
error_count: usize上限で切り捨てた分も含めた実際の検出件数。
Implementations§
Source§impl Parser
impl Parser
pub fn new(lexer: Lexer) -> Self
Sourcepub fn errors(&self) -> &[ParseError]
pub fn errors(&self) -> &[ParseError]
記録済みの構文エラー(上限まで)。
Sourcepub fn error_count(&self) -> usize
pub fn error_count(&self) -> usize
検出した構文エラーの総数(記録上限で切り捨てた分も含む)。
Sourcepub fn take_errors(&mut self) -> Vec<ParseError>
pub fn take_errors(&mut self) -> Vec<ParseError>
記録済みの構文エラーを取り出す(呼び出し側へ渡してログ出力する用途)。
fn record_error(&mut self, message: String)
Sourcefn context_around(&self, at: usize) -> String
fn context_around(&self, at: usize) -> String
エラー位置の前後のトークンを短い文字列にする。
前 6 個・後 3 個。落ちた位置は »« で囲む。
Sourcefn absorb_errors(&mut self, sub: Parser)
fn absorb_errors(&mut self, sub: Parser)
別インスタンス(テンプレート補間式などの副パーサ)が検出したエラーを 自分の記録へ取り込む。位置は副パーサ内の索引なので、由来が分かるよう 印を付ける。
fn cur(&self) -> &Token
fn at(&self, off: usize) -> &Token
fn bump(&mut self) -> Token
fn is_eof(&self) -> bool
fn is_sym(&self, s: &str) -> bool
fn sym_at(&self, off: usize, s: &str) -> bool
fn ident_at(&self, off: usize, s: &str) -> bool
fn kw_at(&self, off: usize, k: &str) -> bool
Sourcefn is_property_key_token(&self, off: usize) -> bool
fn is_property_key_token(&self, off: usize) -> bool
off の位置がオブジェクト/クラスのプロパティ名になり得るトークン
(識別子/予約語/文字列/数値)かどうか(get/set アクセサ判定の先読み用)。
fn eat_sym(&mut self, s: &str) -> bool
Sourcefn expect_sym(&mut self, s: &str)
fn expect_sym(&mut self, s: &str)
記号 s を消費する。無ければ回復して継続しつつ構文エラーとして記録する
(従来は let _ = で「無かった」事実ごと捨てていた)。
fn is_kw(&self, k: &str) -> bool
fn eat_kw(&mut self, k: &str) -> bool
fn ident_name(&mut self) -> Option<String>
pub fn parse_program(&mut self) -> Program
Sourcepub fn parse_program_reporting(&mut self) -> (Program, Vec<ParseError>)
pub fn parse_program_reporting(&mut self) -> (Program, Vec<ParseError>)
パースし、AST と構文エラーの両方を返す。
AST は従来どおり常に返る(ベストエフォート動作を変えない)ので、 呼び出し側は「実行はするが、壊れている事実は知っている」状態にできる。
fn parse_statement(&mut self) -> Option<Statement>
fn parse_block(&mut self) -> Statement
Sourcefn parse_brace_body(&mut self) -> Vec<Statement>
fn parse_brace_body(&mut self) -> Vec<Statement>
{ ... } の中身を Vec
fn parse_var_declaration(&mut self) -> Option<Statement>
Sourcefn parse_using_declaration(&mut self, is_await: bool) -> Option<Statement>
fn parse_using_declaration(&mut self, is_await: bool) -> Option<Statement>
using x = expr, y = expr2; / await using x = expr;。
仕様上バインディングは単純な識別子のみ(分割代入パターンは不可)。
fn parse_if(&mut self) -> Option<Statement>
fn parse_while(&mut self) -> Option<Statement>
fn parse_do_while(&mut self) -> Option<Statement>
fn parse_for(&mut self) -> Option<Statement>
fn finish_c_for(&mut self, init: Option<Box<Statement>>) -> Option<Statement>
fn parse_function_declaration(&mut self, is_async: bool) -> Option<Statement>
fn parse_try(&mut self) -> Option<Statement>
Sourcefn parse_module_specifier(&mut self) -> String
fn parse_module_specifier(&mut self) -> String
文字列指定子(module specifier)を読む。from "mod" の “mod” 部分など。
Sourcefn eat_contextual(&mut self, word: &str) -> bool
fn eat_contextual(&mut self, word: &str) -> bool
文脈依存キーワード(from/as)を ident として消費する。一致したら true。
Sourcefn parse_named_specifiers(&mut self) -> Vec<(String, String)>
fn parse_named_specifiers(&mut self) -> Vec<(String, String)>
{ a, b as c } の中身を (元名, ローカル名) ペアの列として読む。
Sourcefn parse_import(&mut self) -> Option<Statement>
fn parse_import(&mut self) -> Option<Statement>
import 宣言。
形態: import "mod" / import def from "mod" /
import * as ns from "mod" / import { a, b as c } from "mod" /
import def, { a } from "mod" / import def, * as ns from "mod"。
Sourcefn parse_export(&mut self) -> Option<Statement>
fn parse_export(&mut self) -> Option<Statement>
export 宣言。
形態: export default <expr> / export { a, b as c } /
export { a } from "mod" / export * from "mod" /
export var/let/const/function/class ...。
Sourcefn export_decl_names(&self) -> Vec<String>
fn export_decl_names(&self) -> Vec<String>
export に続く宣言から公開すべき名前を先読みで収集する(カーソルは進めない)。
fn parse_expression_statement(&mut self) -> Option<Statement>
fn parse_switch(&mut self) -> Option<Statement>
fn parse_param_list(&mut self) -> Vec<Param>
Sourcefn parse_pattern(&mut self) -> Pattern
fn parse_pattern(&mut self) -> Pattern
束縛パターンをパース(識別子 / {...} / [...])。
fn parse_object_pattern(&mut self) -> Pattern
fn parse_array_pattern(&mut self) -> Pattern
pub fn parse_expression(&mut self) -> Expression
fn parse_assignment(&mut self) -> Expression
fn try_parse_arrow(&mut self) -> Option<Expression>
Sourcefn matching_paren(&self) -> Option<usize>
fn matching_paren(&self) -> Option<usize>
現在位置の ( に対応する ) のインデックスを返す。
fn parse_arrow_body(&mut self) -> Vec<Statement>
fn parse_conditional(&mut self) -> Expression
fn parse_binary(&mut self, min_prec: u8) -> Expression
Sourcefn current_binop_str(&self) -> Option<String>
fn current_binop_str(&self) -> Option<String>
現在のトークンが二項演算子なら、その文字列を返す(instanceof/in 含む)。
fn parse_unary(&mut self) -> Expression
fn parse_new(&mut self) -> Expression
fn parse_postfix(&mut self) -> Expression
Sourcefn parse_call_member(&mut self, allow_call: bool) -> Expression
fn parse_call_member(&mut self, allow_call: bool) -> Expression
メンバ/添字/呼出のチェーン。allow_call=false で呼出を抑止(new 用)。
Sourcefn parse_call_member_tail(
&mut self,
expr: Expression,
allow_call: bool,
) -> Expression
fn parse_call_member_tail( &mut self, expr: Expression, allow_call: bool, ) -> Expression
既存の式に続くメンバ/添字/呼出チェーンを消費する。