2

CUP パーサーが EOF トークンを解析するのに問題があります。%cupJflexコードでフラグを使用すると、次のようなものが存在することを意味するというドキュメントを読みました。

%eofval{
  return new java_cup.runtime.Symbol(<CUPSYM>.EOF);
%eofval}
%eofclose

これはすべて問題ありませんが、文法 (CUP ファイル) で次の最初の規則を試してみると、次のようになります。

program                 ::=   program declaration EOF
                          | /* Empty */
                          ;

EOF が CUP によって宣言されていないというエラー メッセージが表示されます。

Error : java_cup.runtime.Symbol "EOF" has not been declared

わかりましたので、CUP ファイルに以下を追加します。

terminal EOF;

いいえ、CUP が教えてくれるからです。

Fatal : JavaCUP Internal Error Detected: Duplicate terminal (EOF) created
enter code here

ただし、終端の EOF を定義せずに、sym.javaCup が生成するクラスを調べたところ、次のことがわかりました。

  public static final int EOF = 0;

だから私はこれを修正する方法についてかなり迷っています。両方のドキュメントは、この問題について非常に曖昧です。

編集: EOF トークンを解析したい主な理由は、最後にシンボル テーブルとその他のものをデバッグ目的で出力したいからです。

4

3 に答える 3

0
program                 ::=   program declaration EOF
                          | /* Empty */
                          ;

このプロダクションでは EOF は必要ありません。それは暗黙的です。

于 2014-03-31T23:58:07.617 に答える