これは、言語設計で使用される概念をフレームワークの形で抽象化することを目的とした抽象化プロジェクトへの姉妹プロジェクトに焦点を当てた一連の質問の一部です。姉妹プロジェクトはOILexerと呼ばれ、一致時にコードインジェクションを使用せずに、文法ファイルからパーサーを構築することを目的としています。
構造タイピングに関連するこれらの質問に関連する他のいくつかのページは、ここに表示され、使いやすさはここにあります。フレームワークに関する問い合わせに関連するメタトピックと投稿する適切な場所は、こちらにあります。
特定の文法から解析ツリーの抽出を開始するところまで来ています。その後、DFAを使用して順方向パスを識別する再帰的降下パーサーが続きます(ANTLR 4のLL(*)と同様)。私はそれを開いて洞察を得るだろうと考えました。
パーサーコンパイラでは、どのような機能が理想的ですか?
これまでのところ、実装されているものの簡単な概要です:
- テンプレート
- 特定の時点で何が有効であるかを把握しながら、予測を先読みします。
- ルール内のリテラルを取得し、それらがどのトークンからのものであるかを解決するルール「非文字化」。
- 非決定的オートマトン
- 確定的オートマトン
- トークン認識のためのシンプルな字句状態マシン
- トークンの自動化方法:
- スキャン-コメントに役立ちます:Comment:= "/ *" Scan( "* /");
- 減算-識別子に便利です:識別子:= Subtract(IdentifierBody、Keywords);
- 識別子がキーワードを受け入れないようにします。
- エンコード-ベースN遷移のシリーズXカウントとしてオートメーションをエンコードします。
- UnicodeEscape:= "\\ u" BaseEncode(IdentifierCharNoEscape、16、4);
- 16進数の4遷移を使用して、Unicodeを16進数でエスケープします。これとの違い:[0-9A-Fa-f] {4}は、Encodeを使用した結果の自動化で、許可される16進値のセットをIdentifierCharNoEscapeのスコープに制限します。したがって、\ u005cを指定すると、エンコードバージョンは値を受け入れません。このようなことには重大な注意事項があります。控えめに使用してください。結果として生じる自動化は非常に複雑になる可能性があります。
- UnicodeEscape:= "\\ u" BaseEncode(IdentifierCharNoEscape、16、4);
実装されていないのはCST生成です。これを機能させるには、適切なコンテキストを引き継ぐように決定論的自動化を調整する必要があります。
興味のある方のために、T *y♯プロジェクトの元のフォームをかなり印刷したものをアップロードしました。各ファイルは他のすべてのファイルにリンクする必要があります。それらに従うために個別のルールでリンクを開始しましたが、時間がかかりすぎました(自動化の方が簡単だったでしょう)。
さらにコンテキストが必要な場合は、それに応じて投稿してください。
編集5-14-2013:特定の言語でステートマシンのGraphVizグラフを作成するコードを書きました。 これがAssemblyPartのGraphVizダイグラフです。言語の説明でリンクされているメンバーは、そのルールのダイグラフを含む相対フォルダーにrulename.txtを持っている必要があります。例を投稿してから一部の言語の説明が変更されました。これは、文法に関することを簡略化するためです。これが興味深いgraphviz画像です。