CUP パーサーが EOF トークンを解析するのに問題があります。%cup
Jflexコードでフラグを使用すると、次のようなものが存在することを意味するというドキュメントを読みました。
%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.java
Cup が生成するクラスを調べたところ、次のことがわかりました。
public static final int EOF = 0;
だから私はこれを修正する方法についてかなり迷っています。両方のドキュメントは、この問題について非常に曖昧です。
編集: EOF トークンを解析したい主な理由は、最後にシンボル テーブルとその他のものをデバッグ目的で出力したいからです。