字句解析器がすべきこととすべきでないことは?
そうすべき:
- トークンを認識する
- 無視できる空白とコメントを無視する (そのようなものがある場合)
- オプションで、意味のあるエラー メッセージを生成するために、ソースの場所を追跡します。
このような単純な言語では非常に魅力的ですが、入力の解析を試みるべきではありません。
私が見る限り、次のトークンがあります。
- 句読点:
/
、.
、線形空白、改行
- 数字
- 引用符で囲まれていない文字列 (「atoms」または「id」と呼ばれることが多い)
- 引用符で囲まれた文字列 (おそらく、引用符で囲まれていない文字列と同じトークン タイプ)
構文が何であるかはわかりません-options
が、それにはさらに多くの可能性が含まれる可能性があります。
トークンとして返すlinear-white-space
(つまり、タブとスペースのみで構成されるシーケンス) を選択することには、やや疑問があります。特に、行頭や行末など、空白が無視できる場所がおそらくあるため、文法がかなり複雑になります。しかし、パス内に空白を許可したくないという直感があり、コマンド名とその引数の間にそれを要求する予定です。つまり、次を禁止します。
/left /right[3] .whimper "hello, world"
/left/right[3].whimper"hello, world"
しかし、多分私は間違っています。たぶん、あなたは両方を喜んで受け入れます。両方を受け入れると、線形空白を完全に無視できるため、それはより簡単になります。
ところで、経験上、改行を使用してコマンドを区切るのは扱いにくい場合があります。遅かれ早かれ、行全体を表示するために追加のモニターを購入する必要がないように、コマンドを 2 行に分割する必要があります。継続する行の最後の文字としてa を置くという規則 (特に bash や C プリプロセッサで使用される)\
は可能ですが、厄介なバグ (の後に目に見えないスペースがある\
ため、実際にはそれが妨げられるなど) につながる可能性があります。行を継続します)。
ここから先は、100%個人の意見であり、無料で提供されています。だから、その価値のためにそれを取ります。
私はそれを技術的に適切な作品にしようとしています。営利目的ではないので時間があり、字句解析と構文解析をよりよく学ぶことができます。パーサー ライブラリを使用したくありません。
私の意見では、ここに矛盾があります。または、おそらく 2 つの矛盾。
技術的に適切な作業では、標準ツールを使用します。少なくとも語彙ジェネレーターとおそらくパーサージェネレーター。適切に使用すれば、ツールに提供される語彙的および文法的記述が実際の言語を正確に文書化し、ツールが目的の言語が実際に認識されるものであることを保証するためです。その場しのぎのコードを書くことは、単純な字句認識エンジンや再帰的降下パーサーでさえ、エレガントであるにもかかわらず、自己文書化が少なく、保守性が低く、正確性の保証が少なくなります。したがって、ベスト プラクティスは「標準ツールを使用する」ことです。
第二に、アドホックなレクサーとパーサーを書くことが語彙と構文解析の理論を理解するのに役立つというあなたのインストラクターに同意しません (あなたのコメントに基づいて彼らの提案を正しく理解しているなら)。実は逆効果かもしれません。理論的にも実際的にも信じられないほど洗練されたボトムアップ構文解析は、手で書くことはほとんど不可能であり、読むことはまったく不可能です。その結果、多くのプログラマーは、コードを理解しているため、再帰降下または Pratt パーサーを使用することを好みます。ただし、このようなパーサーは、ボトムアップ パーサー (特に、完全に一般的な GLR または Earley パーサー) ほど強力ではなく、それらを使用すると、不必要な文法上の妥協につながります。
正規表現を理解するために正規表現ライブラリを作成する必要はありません。ライブラリは厄介な実装の詳細を抽象化し (そしてそれらはたくさんあり、実際には厄介です)、正規表現の作成と使用の本質に集中できるようにします。
同様に、C でプログラミングする方法を理解するためにコンパイラーを作成する必要はありません。Cの基礎を十分に理解したら、それが機械語コードにどのように変換されるかを理解することで (おそらく) 理解を深めることができますが、コンパイラー作成のキャリアを計画していない限り、あいまいな最適化アルゴリズムの詳細を知っていても、優れたプログラマーにはなりません。または、少なくとも、彼らはあなたの議題の最初ではありません.
同様に、正規表現を本当に理解したら、ライブラリを書くのが面白いと思うかもしれません。信じられないほどイライラして、数か月のハードワークの後にあきらめるかもしれません。いずれにせよ、既存のライブラリをより高く評価するでしょう。ただし、最初に既存のライブラリの使用方法を学習してください。
パーサージェネレーターも同様です。プログラミング言語のアイデアを正確で実装可能なものに変換する方法を学びたい場合は、パーサー ジェネレーターの使用方法を学びます。構文解析の理論を習得して初めて、低レベルの実装に焦点を当てることを考えるべきです。