0

私は単純な言語のコンパイラを書いています。

ファイルを取得してトークンを に出力するレクサー/トークナイザーを作成しましたstdout

構文解析を行いたいのですが、トークンを入力として受け取るためにレクサーを変更する方法がわかりません。

  • リンクされたリストは、大きなファイルに対して非常に非効率的です (約 80MB のソース ファイルは約 1.3GB の RAM を必要とします)。
  • レクサーを変更して、呼び出されるたびに次のトークンを提供することもできます (アイデアは Dragon Book から取られました) が、プロセスのどこかで前のトークンに戻って読み取らなければならない場合、どうすればよいかわかりません。

これらのことを行う正しい方法は何ですか?

4

2 に答える 2

1

nextToken()字句解析器でメソッドを実装するのが標準的な方法です。このメソッドは、入力全体が消費されるまで、パーサー (または構文アナライザー) によって呼び出されます。

しかし、プロセスのどこかで戻って前のトークンを読み取らなければならない場合、私は何をしますか

これは通常は当てはまりません。しかし、パーサーが行う必要があるのは、既に認識されているトークン (またはパーサーの先読みに応じていくつかのトークン) を「プッシュバック」することです。この場合、レクサーは を提供します。pushBack(Token)これにより、 の次の呼び出しnextToken()で、入力に現れる次のトークンではなく、提供されたトークンが返されます。

于 2011-03-27T17:52:23.103 に答える
0

しかし、プロセスのどこかで戻って前のトークンを読み取らなければならない場合、私は何をしますか

あなたの試合は貪欲すぎるようですね。

あなたはバックトラッキングを調べるかもしれません

于 2011-03-27T10:29:06.937 に答える