我很难让我的CUP解析器解析EOF令牌。我在文档中看到,在我的Jflex代码中使用%cup标志意味着存在这样的东西:
%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;不,因为那杯告诉我:
Fatal : JavaCUP Internal Error Detected: Duplicate terminal (EOF) created
enter code here但是,没有定义终端EOF,我查看了Cup生成的sym.java类,我确实发现:
public static final int EOF = 0;所以我不知道该怎么解决这个问题。这两个方面的文件在这个问题上都很模糊。
编辑:我想解析EOF令牌的主要原因是,我想打印出我的符号表,以及其他用于调试的东西。
发布于 2014-04-01 18:06:41
好的,所以我没有显式地解析EOF令牌来执行一些代码,而是在语法中添加了下面的“包装器”,这允许我做我想做的事情。
而不是:
program ::= program declaration
| /* Empty */
;我现在有:
initial ::= program {: /* Code for EOF here */ :}
;
program ::= program declaration EOF
| /* Empty */
;这允许我在每一个成功的解析结束时执行代码。
发布于 2014-03-31 23:58:07
program ::= program declaration EOF
| /* Empty */
;你在这次生产中不需要EOF。这是含蓄的。
发布于 2017-06-08 18:57:21
确保在与"file.cup“对应的语法产品中没有忘记";”。
https://stackoverflow.com/questions/22772799
复制相似问题