カスタムレキシカルアナライザを使用したエラー回復

エラーリカバリに関する説明はカスタムレキシカルアナライザと互換性が良好ですが、エラーリカバリはパーサーエラーからの回復のみをサポートし、レキシカルアナライザエラーからの回復はサポートしていません。このページでは、レキシカルアナライザエラーからの回復方法を紹介します。 エラーリカバリを有効にするには: use lalrpop_util::ErrorRecovery; - parser_def ...

8月19日 16:58 投稿

エラー回復によるパーサーの堅牢化

標準設定では、パーサーは入力にエラーが見つかると即座に処理を中断します。しかし実際には、複数の問題を一度に検出したいケースも多く存在します。LALRPOPではこの要件に対応できますが、文法定義内で明示的に「エラー回復ポイント」を指定する必要があります。これは特別な!トークンを使用して実現します。このトークンはパーサーが入力エラーを検出した際にのみ出現し ...

8月2日 16:49 投稿

LALRPOPにおける生成規則の優先順位の定義方法

LALRPOP では、優先順位の定義は precedence! ブロックと %prec ディレクティブを組み合わせて行います。これは yacc や bison に似ていますが、Rust のスタイルも取り入れられています。 ✅ 方法一:precedence! ブロックによる優先順位の定義(推奨) LALRPOP には precedence! マクロ構文があり、式に対して複数のサブルールを定義し、優先順位を上から下へ(上の方が ...

7月26日 02:34 投稿

RustのLALRPOPにおける参照型トークンを利用したカスタム字句解析器の実装

カスタム字句解析器を実装する際、生成されるトークンに元の入力文字列への参照を持たせる設計が有効な場合があります。変数名や識別子などの任意の記号を扱う構文木を構築する際、文字列データを複製せず参照を保持することで、メモリアロケーションの削減と解析速度の向上が実現できます。 抽象構文木の定義 まず、識別子を含む計算機の抽象構文木を定義します。数値リ ...

7月22日 01:24 投稿

LALRPOP における型推論と構文糖衣

LALRPOP では、アクションコードを省略可能な構文糖衣を提供しており、これによりパーサ定義をより簡潔に記述できる。特に、他の非終端記号から値をそのまま受け取るようなケースでは、明示的なアクションコードを書く必要がない。 例えば、次のような Term の定義があるとする: pub Term: i32 = { <n:Num> => n, "(" <t:Term> ")" => t, }; ...

6月24日 00:49 投稿

カスタムレキサーの作成

Whitespace言語のパースにおけるレキサー実装 Whitespace言語をパースする際、次のような文法構造を想定します: pub Program = <Statement*>; Statement: ast::Stmt = { " " <StackOp>, "\t" " " <MathOp>, "\t" "\t" <HeapOp>, "\n" <FlowCtrl>, "\t" "\n" <Io>, }; StackOp: ast::Stmt = { " " <Nu ...

5月23日 21:29 投稿