问题标签 [cup]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
74 浏览

cup - 如何在 CUP 中表示可选标记

我正在使用 java CUP 为一种小型编程语言生成一个 LARL(1) 解析器。是否有一种紧凑的形式来表达规则中的可选非终结符?例如,在以下规则中

我重复四次基本上相同的东西,当它很自然地放上类似的东西时

0 投票
1 回答
821 浏览

java - 调试 CUP 语法

我在调试 CUP 语法时遇到了困难。

所以我在 CUP 中有以下语法:

词法分析器将以下标记提供给 CUP 分析器:

(在哪里;SEPARATOR划分{ }块。

当我运行它时,我得到以下输出:

(带有单个单词的行表示对导致打印标记的词法分析器的调用。带有 CUP 规则的行表示该规则被匹配。第 7 行是带有 while 语句的行。)

似乎块是失败的原因;当我从提供给语法的内容中删除所有块时,一切都会按我的预期进行解析。

但是,我看不出为什么没有正确解析这些块。

关于可能是什么问题或如何进一步测试的任何想法?

编辑:如果您需要我可能已忽略回答的详细信息,完整代码可在此 repo中找到

0 投票
1 回答
1246 浏览

jflex - jflex / cup - 错误:找不到符号{返回符号(sym.EQEQ);

我正在尝试在以下位置运行示例:http: //jflex.de/manual.html#Example 我已经复制了示例并且只更改了文件/类名。

运行 jflex 似乎工作正常。

作为下一步,我尝试编译输出。无论我做什么,我都会收到这些错误。

我是不是忘记了什么?

http://czt.sourceforge.net/dev/java-cup-runtime/apidocs/java_cup/runtime/Symbol.html

0 投票
2 回答
1032 浏览

java - 如何匹配 CUP 解析器语法中的空大小写

我正在使用 CUP 生成解析器,并且我希望空文件成为可接受的程序。根据对此处类似问题的回答,我已尝试将空案例添加到我的开始符号中。

包括所需的空箱会给我以下错误:

如何修改语法以使解析器接受空文件?我使用 Jflex 作为我的词法分析器,并使用 ComplexSymbolFactory 作为符号的类型。

编辑:我已经确认上面的语法是包含空的正确方法。但是,ComplexSymbolFactory 在将空对象转换为符号时遇到问题。即使从官方 CUP 网站运行此示例,我也会收到此错误。

0 投票
1 回答
640 浏览

java - 将非终端转换为 java_cup.runtime.Symbol 以用于语法中的空大小写

我正在使用 JFlex 和 CUP 编写编译器。我正在尝试解析 .cup 文件中的空状态。为了简化事情,请考虑以下语法:

在这里,Statement.stub() 返回一个存根的 Statement 实例用于测试目的。

我收到此错误:

我对此感到困惑,因为对 newSymbol 的调用提供了参数:

这与我的解析器中对 newSymbol() 的所有其他调用不同。对 newSymbol() 的所有其他调用都采用以下形式:

有效地将 RESULT 转换为 Object 而不是 Symbol。

所以。我在这里做错了什么?为什么空的情况下会产生如此奇怪的解析器?解决方案是什么?

0 投票
1 回答
1703 浏览

java - 当用户定义变量或函数的类型时,Java CUP(解析器)会产生移位/减少冲突

我的语法需要有用户定义的类型 ID 组合。下面代码的问题在于它会生成以下内容:

我试图在 VariableDecls 和 Stmts 作品中摆脱我的语法中的 E 作品,但没有成功。我也尝试过用type产生ID,然后产生e产生。包cup.example;

0 投票
1 回答
924 浏览

parsing - 减少/减少 CUP 中的冲突

我正在使用 Java CUP 为 Java 子集实现解析器。

语法就像

这工作正常,但是当我添加

CUP 不起作用,警告是:

我认为有两个问题:
1.type ::= ID并且exp ::= ID,当解析器看到一个 ID 时,它想要减少它,但它不知道要减少哪个,type或者exp.

  1. stmt ::= ID LBRACKET exp RBRACKET ASSIGN exp SEMI用于分配数组中的元素,例如arr[key] = value;
    exp :: exp LBRACKET exp RBRACKET用于从数组中获取元素的表达式,例如arr[key]

所以在这种情况下arr[key],当解析器看到 时arr,它知道它是一个ID,但它不知道它是否应该转移或减少到exp

但是,我不知道如何解决这个问题,如果你有的话,请给我一些建议,非常感谢。

0 投票
1 回答
41 浏览

java - 用 Cup 做前缀表示法

我创建了这段代码:

这个表达式的解决方案: alfa + beta * gamma +77 是 + + alfa * beta gamma 77 但程序没有显示正确的解决方案,任何人都可以帮助我吗?

0 投票
0 回答
556 浏览

java - Java CUP - 令牌值为空

我想打印出解析器中调用的标记的值(由扫描仪返回),但是每个标记都显示为空。

例如当输入文件是

这个语法应该打印“ tmp assignment ”而不是“null assignment”:

有没有其他方法可以获得实际价值(除了书面代码:D),还是我应该做任何进一步的步骤来获得它们?

可能需要的部分代码:

词法分析器

我以 YYINITIAL 状态返回它的方式:

解析器.cup

0 投票
1 回答
224 浏览

java - 为什么 Symbol 的字段(左右)总是返回 0?

我正在使用 CUP 和 JFLEX 开发一个帕斯卡编译器。要求之一是从错误中恢复并显示错误在哪里。

我一直在使用 CUP 的syntax_error方法unrecovered_syntax_error

这是我的 parser.cup 中的解析器代码

这是我的 CFG 的一部分,我只关注我声明错误产生的地方

这是我的 Main.java

我相信 s.right 和 s.left 应该在出现新错误时改变它的值,但是当我有两个错误时:

它应该返回

其中 numberX 和 numberY 可以彼此相等,numberW 和 numberZ 可以彼此相等,但是一对不能等于另一对。

然而,它回报我

如果有人帮助我了解为什么会发生这种情况和/或如何解决它,我将很高兴。