6

C ++でパーサーとライターを使用する必要があります。関数を実装しようとしていますが、トークンが何であるかわかりません。私の機能/操作の1つは、生成するトークンがさらにあるかどうかを確認することです

bool パーサー::hasMoreTokens()

これについてどうすればいいですか、助けてください

それで!

テキストを含むテキスト ファイルを開いていますが、すべての単語が小文字になっています。より多くのトークンがあるかどうかを確認するにはどうすればよいですか?

これは私が持っているものです

bool Parser::hasMoreTokens() {

while(source.peek()!=NULL){
    return true;
}
    return false;
}
4

6 に答える 6

6

トークンは、字句解析の出力と構文解析への入力です。通常、それらは次のようなものです

  • 数字
  • 変数名
  • 括弧
  • 算術演算子
  • ステートメントターミネータ

つまり、大まかに言って、一度に1文字ずつ入力を調べるコードによって明確に識別できる最大のものです。

混乱する場合は無視してかまいません。字句解析と構文解析の境界は少しあいまいです。例えば:

  1. 2+3i一部のプログラミング言語には、またはのように見える複素数リテラルがあります3.2e8-17e6i。そのような言語を構文解析している場合は、字句解析器で複素数全体を飲み込んでトークンにすることができます。または、より単純なレクサーとより複雑なパーサーを使用して、(たとえば)3.2e8-17e6i個別のトークンにすることもできます。その場合、パーサーの仕事(またはコードジェネレーターの仕事)は、取得したものが実際には単一のリテラルであることに気付くでしょう。

  2. 一部のプログラミング言語では、レクサーは、指定されたトークンが変数名であるかタイプ名であるかを判別できない場合があります。(たとえば、これはCで発生します。)ただし、言語の文法によって2つが区別される場合があるため、「変数foo」と「typenamefoo」を異なるトークンにする必要があります。(これはCでも発生します。)この場合、それぞれの場合に適切な種類のトークンを生成できるように、パーサーからレクサーに情報をフィードバックする必要がある場合があります。

つまり、「トークンとは正確には何ですか?」必ずしも完全に明確に定義された答えがあるとは限りません。

于 2011-04-12T17:28:34.013 に答える
3

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

おそらく確かなことが1つあります(各文字がトークンでない限り)。ストリームを先読みする必要があります。通常、1つの文字を見ただけでは、トークンがもっとあるかどうかはわかりません。実際、トークナイザーが一度にトークン全体を読み取り、パーサーがそれを必要とするまでそれを保持することは、一般的に有用であることがわかりました。のような関数hasMoreTokensは、実際には完全なトークンをスキャンします。

(そして、私がそれに取り組んでいる間、if sourceis istreamistream::peekはポインターを返しませんが、int。)

于 2011-04-12T18:12:56.003 に答える
2

大きなユニット(長い文字列)をサブユニット(小さな文字列)のグループに分割する場合、各サブユニット(小さな文字列)は「トークン」と呼ばれます。サブユニットがもうない場合は、解析が完了しています。

C ++で文字列をトークン化するにはどうすればよいですか?

于 2011-04-12T17:27:50.110 に答える
2

トークンは、意味を持つプログラミング言語の最小単位です。括弧(、名前foo、整数123はすべてトークンです。テキストを一連のトークンに減らすことは、通常、テキストを解析する最初のステップです。

于 2011-04-12T17:28:42.080 に答える
1

トークンは通常、自発的な言語の単語に似ています。C ++では、(int、float、5.523、const)はトークンになります。セマンティック要素を構成するテキストの最小単位です。

于 2011-04-12T17:27:35.710 に答える
0

トークンは、文法の終端であり、シーケンス自体によって定義される 1 つまたは複数の記号のシーケンスです。つまり、文法で定義された他の生成物から派生するものではありません。

于 2011-04-12T17:30:28.003 に答える