首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在CUP中解析EOF令牌

在CUP中解析EOF令牌
EN

Stack Overflow用户
提问于 2014-03-31 21:43:27
回答 3查看 5.3K关注 0票数 2

我很难让我的CUP解析器解析EOF令牌。我在文档中看到,在我的Jflex代码中使用%cup标志意味着存在这样的东西:

代码语言:javascript
复制
%eofval{
  return new java_cup.runtime.Symbol(<CUPSYM>.EOF);
%eofval}
%eofclose

这一切都很好,但是当我尝试语法(CUP文件)中的第一条规则时:

代码语言:javascript
复制
program                 ::=   program declaration EOF
                          | /* Empty */
                          ;

我得到一个错误消息,EOF不是由CUP声明的。

代码语言:javascript
复制
Error : java_cup.runtime.Symbol "EOF" has not been declared

好的,我将以下内容添加到我的CUP文件中:

代码语言:javascript
复制
terminal EOF;

不,因为那杯告诉我:

代码语言:javascript
复制
Fatal : JavaCUP Internal Error Detected: Duplicate terminal (EOF) created
enter code here

但是,没有定义终端EOF,我查看了Cup生成的sym.java类,我确实发现:

代码语言:javascript
复制
  public static final int EOF = 0;

所以我不知道该怎么解决这个问题。这两个方面的文件在这个问题上都很模糊。

编辑:我想解析EOF令牌的主要原因是,我想打印出我的符号表,以及其他用于调试的东西。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-04-01 18:06:41

好的,所以我没有显式地解析EOF令牌来执行一些代码,而是在语法中添加了下面的“包装器”,这允许我做我想做的事情。

而不是:

代码语言:javascript
复制
program                 ::=   program declaration
                          | /* Empty */
                          ;

我现在有:

代码语言:javascript
复制
initial                 ::=   program   {: /* Code for EOF here */ :}
                          ;
program                 ::=   program declaration EOF
                          | /* Empty */
                          ;

这允许我在每一个成功的解析结束时执行代码。

票数 2
EN

Stack Overflow用户

发布于 2014-03-31 23:58:07

代码语言:javascript
复制
program                 ::=   program declaration EOF
                          | /* Empty */
                          ;

你在这次生产中不需要EOF。这是含蓄的。

票数 0
EN

Stack Overflow用户

发布于 2017-06-08 18:57:21

确保在与"file.cup“对应的语法产品中没有忘记";”。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22772799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档