少し複雑なデータ形式のレクサー (re2c を使用) とパーサー (Lemon を使用) を作成しています。引用符とコンマで囲まれているが、バランスのとれた中かっこがあるなど)、中かっこ内の文字列、およびパラメーターを含むことができる左中かっこと右中かっこを含む関数呼び出しのように見える文字列。
私が最初に試みたのは、多くの状態を持つレクサーで、各状態は特定の文字列形式に対応していました。しかし、レクサーからの多くの役に立たない「予期しない入力」メッセージ (非常に大きくなった) の後、パーサーの仕事をしようとしている可能性があることに気付きました。私は最初の試行を破棄し、状態が 1 つだけのレクサー、多くの文字トークン、およびトークンをさまざまな文字列型に結合するパーサーを使用しました。これはうまく機能し、何かがオフになっているときにパーサーからより役立つ構文エラーが表示されますが、それでもまだ正しくないと感じています。レクサーに 1 つまたは 2 つの状態を追加することを考えていますが、パーサーから状態を開始すると、特定のインスタンスでどの文字列型が必要になるかについて、より優れた「概要」が得られます。全体的に私は少しばかげているように感じます:(
私は正式なコンピュータ サイエンスのバックグラウンドを持っておらず、数学に重きを置いた理論からは少し離れています。しかし、レクサーが何をすべきか (そしてすべきでないか) とパーサーがすべき作業の部分を説明するチュートリアルや本がどこかにあるかもしれません。適切なトークン パターンを構築する方法、レクサー状態をいつ使用するか、(LALR パーサーを使用して) 再帰規則をいつどのように使用するか、あいまいな規則を回避する方法。基本を教えてくれる実用的な料理本。「Lex と YACC の入門書/HOWTO」は素晴らしかったですが、十分ではありませんでした。データ形式を解析したいだけなので、コンパイラ構築に関する本 (赤いドラゴンの本など) は少し大きすぎるように見えます。
または、誰かがここで簡単なルールを教えてくれるかもしれません。