トークンはあなたが望むものです。従来(そして正当な理由で)、言語仕様は分析を2つの部分に分割しました。最初の部分は入力ストリームをトークンに分割し、2番目の部分はトークンを解析しました。(理論的には、トークンを使用せずに、または同じことで、個々の文字をトークンとして使用して、単一レベルでのみ文法を記述できると思います。C++のような言語での結果は見たくありません。ただし、トークンの定義は、解析する言語に完全に依存します。たとえば、ほとんどの言語では、空白を区切り文字として扱います(Fortranではありません)。ほとんどの言語は、句読文字を使用して句読点/演算子のセットを事前定義し、これらの文字を記号に使用できないようにします(ただし、「abc-def」が単一の記号であるCOBOLは許可しません)。場合によっては(C ++プリプロセッサを含む)、トークンとはコンテキストによって異なるため、パーサーからのフィードバックが必要になる場合があります。(うまくいけば、そうではありません。そのようなことは、非常に経験豊富なプログラマー向けです。)
おそらく確かなことが1つあります(各文字がトークンでない限り)。ストリームを先読みする必要があります。通常、1つの文字を見ただけでは、トークンがもっとあるかどうかはわかりません。実際、トークナイザーが一度にトークン全体を読み取り、パーサーがそれを必要とするまでそれを保持することは、一般的に有用であることがわかりました。のような関数hasMoreTokens
は、実際には完全なトークンをスキャンします。
(そして、私がそれに取り組んでいる間、if source
is istream
:
istream::peek
はポインターを返しませんが、int
。)