6

少し複雑なデータ形式のレクサー (re2c を使用) とパーサー (Lemon を使用) を作成しています。引用符とコンマで囲まれているが、バランスのとれた中かっこがあるなど)、中かっこ内の文字列、およびパラメーターを含むことができる左中かっこと右中かっこを含む関数呼び出しのように見える文字列。

私が最初に試みたのは、多くの状態を持つレクサーで、各状態は特定の文字列形式に対応していました。しかし、レクサーからの多くの役に立たない「予期しない入力」メッセージ (非常に大きくなった) の後、パーサーの仕事をしようとしている可能性があることに気付きました。私は最初の試行を破棄し、状態が 1 つだけのレクサー、多くの文字トークン、およびトークンをさまざまな文字列型に結合するパーサーを使用しました。これはうまく機能し、何かがオフになっているときにパーサーからより役立つ構文エラーが表示されますが、それでもまだ正しくないと感じています。レクサーに 1 つまたは 2 つの状態を追加することを考えていますが、パーサーから状態を開始すると、特定のインスタンスでどの文字列型が必要になるかについて、より優れた「概要」が得られます。全体的に私は少しばかげているように感じます:(

私は正式なコンピュータ サイエンスのバックグラウンドを持っておらず、数学に重きを置いた理論からは少し離れています。しかし、レクサーが何をすべきか (そしてすべきでないか) とパーサーがすべき作業の部分を説明するチュートリアルや本がどこかにあるかもしれません。適切なトークン パターンを構築する方法、レクサー状態をいつ使用するか、(LALR パーサーを使用して) 再帰規則をいつどのように使用するか、あいまいな規則を回避する方法。基本を教えてくれる実用的な料理本。「Lex と YACC の入門書/HOWTO」は素晴らしかったですが、十分ではありませんでした。データ形式を解析したいだけなので、コンパイラ構築に関する本 (赤いドラゴンの本など) は少し大きすぎるように見えます。

または、誰かがここで簡単なルールを教えてくれるかもしれません。

4

2 に答える 2

7

あなたが本当にすべきことは、あなたの言語の文法を書くことです。それができたら、境界は簡単です。

  • lexer は、入力を受け取り、使用している端末を通知する役割を果たします。
  • パーサーは、抽象構文ツリー (AST)または解析エラーが発生するまで、一連の終端記号と非終端記号をプロダクション ルールに繰り返し一致させる役割果たします

不可能な文字やその他の非常に基本的なビットを拒否する場合を除いて、レクサーは入力の検証を担当しません。パーサーはそれをすべて行います。

https://www.cs.rochester.edu/u/nelson/courses/csc_173/grammars/parsing.htmlをご覧ください。これは、解析に関する CS コースの紹介ページです。

于 2010-07-07T07:16:11.393 に答える
5

パーサーまたはレクサーによって何かを行う必要があるかどうかを判断するための良いリトマス試験紙は、次の質問を自問することです。

構文に、再帰的、ネストされた自己類似要素が含まれていますか?
(例: ネストされた括弧、ブレース、タグ、サブ式、サブセンテンスなど)。

そうでない場合は、単純な正規表現で十分であり、レクサーで実行できます。
はいの場合、少なくとも文脈自由文法であるため、パーサーで分析する必要があります。

Lexer は一般に、言語の「単語」を見つけて分類するためのものです (それは名詞ですか? 動詞ですか? 形容詞ですか? など)。
パーサーは、適切な「文」を見つけて、それらが特定の言語で適切な文であるかどうかを構造化するためのものです。

于 2010-09-01T05:01:37.983 に答える