问题标签 [sablecc]

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 投票
3 回答
322 浏览

eclipse - 在eclipse中运行外部工具时删除某些类?

我在eclipse(3.4)中设置了一个外部工具(sablecc),它在当前项目中生成一堆类。我需要相当频繁地运行这个工具并重新生成这些类。这意味着每次我想运行 sablecc 时,我都必须手动删除 sablecc 创建的包/类,以确保我不会在新旧生成的类之间发生冲突。是否有一些简单的方法可以从 Eclipse 或其他方式中自动执行此操作?

0 投票
5 回答
12887 浏览

php - 解析bbcode的最佳方法

我想为 php 网站开发一个 bbcode 过滤器。(我正在使用 cakephp,它将是一个 bbcode 助手)我有一些要求。

Bbcodes 可以嵌套。所以这样的事情是有效的。

Bbcode 可以有 0 个或多个参数。

示例:

Bbcodes 可能有多种行为。

比方说,[url]text[/url]将转换为[url:url="text"]text[/url] 或视频 bbcode 将能够在 youtube、dailymotion 之间进行选择......

我认为它可以满足我的大部分需求。我已经用正则表达式做了一些事情。但我最大的问题是匹配参数。事实上,我得到了嵌套的 bbcode 和 0 参数的 bbcode。但是当我为参数添加正则表达式匹配时,它没有正确匹配嵌套的 bbcode。

"\[($tag)(=.*)\"\](.*)\[\/\1\]" // 不是 .* 而是非贪婪匹配器

我现在没有完整的正则表达式,但我有一些看起来像那样的东西(上图)。

那么有没有办法用正则表达式或其他东西有效地匹配 bbcode。我唯一能想到的是使用访问者模式并以这种方式将我的文本与每个可能的标签分开,我可以对我的文本解析有更多的控制,我可能可以验证我的文档,所以如果输入文本没有'没有有效的 bbcode。我可以在保存任何内容之前通知用户错误。

我会使用 sablecc 创建我的文本解析器。 http://sablecc.org/

有更好的主意吗?或任何可能导致高效灵活的 bbcode 解析器的东西?

谢谢你,对不起我的英语不好......

0 投票
1 回答
1573 浏览

shift-reduce-conflict - 移位/减少与 SableCC 的冲突

我第一次体验 SableCC 和语法定义。我有以下语法(其中一部分):

我有以下错误:

我通过将 l_par 和 r_par 添加到所有替代方案来解决它们,顺便说一下,这应该增加可读性,但是有没有办法以优雅的方式做到这一点?

谢谢。

0 投票
1 回答
1292 浏览

eclipse - 从使用 SableCC 创建的解析器开始的 Eclipse 自定义文本编辑器

今天的问题如下:我正在为我的大学部门开发一个代码生成器。这很简单:他们想使用一种真正人类可读的自定义“脚本”语言,对其进行解析,然后将这些指令翻译成 Java。我使用 SableCC 来完成这个技巧,它真的很流畅。现在的问题是我必须为 Eclipse 创建一个插件编辑器,主要是为了语法高亮目的,并可能捕获验证错误。

我找到了很多关于“如何在 Eclipse 中创建自定义编辑器”的教程,但我想不通的是:我已经创建了解析器和扫描仪吗?为编辑再次这样做是无稽之谈。有没有办法将我的扫描仪集成到插件中?我应该扩展或实现什么类?你能推荐任何教程吗?

0 投票
2 回答
551 浏览

parsing - sablecc 在 prod = (expr | expr')* 形式的生产规则上的问题

问题出在

如果我设置clsdata

或者

它工作得很好,但是,正如你可以想象的那样,它的含义与我的意图不同。我想要一个类同时允许方法和字段(没有特定的顺序!)。

所以我的问题是我应该如何定义clsdata以免出错。我可以想到递归替代方案,但我想尽可能保持干净!

谢谢

0 投票
1 回答
207 浏览

compiler-construction - 使用简单的求和和乘法语法的逆向推导问题

我在理解如何使用自下而上的解析器(例如,输入字符串1 + 2 * 3)从“底部”到“顶部”时遇到了一些麻烦。

这是我正在使用的语法(我会说它是正确的,因为它是在 Crafting a Compiler 中找到的)

这是我的反向推导:

问题是每次我得到一个整数作为输入时,它都会自动“转换”为E.

我很肯定给定的语法是正确的。我还在 sablecc 中尝试了一些输入字符串(使用我制作的 Pretty Printer 访问者),它们都产生了正确的结果。

这样,我知道问题出在我身上,而不是语法本身。那我做错了什么?

谢谢!

0 投票
1 回答
1800 浏览

java - 测试编译器

我目前正在研究一种使用sablecc构建的编译器。

长话短说,编译器会将规范文件(这是我们正在解析的)和 .class 文件作为输入,并将检测 .class 文件的字节码,以确保在运行 .class 文件时,任何规范没有被违反(这有点像 jml/code 合同!但更强大)。

我们有几十个系统测试,涵盖了分析阶段的大部分(与确保规范有意义相关,并且它们也与它们应该指定的 .class 文件一致)。

我们将它们分为两组:有效测试和无效测试。

  • 有效的测试由源代码文件组成,当我们的编译器编译时应该不会弹出编译器错误/警告。

  • 无效测试由源代码文件组成,当我们的编译器编译时,它们应该会弹出至少一个编译器错误/警告。

当我们处于分析阶段时,这对我们很有帮助。现在的问题是如何测试代码生成阶段。过去,我已经通过我在编译器课程中开发的一个小编译器完成了系统测试。每个测试将包含该语言的几个源文件和一个output.txt. 运行测试时,我会编译源文件,然后运行它的 main 方法,检查输出结果是否等于output.txt. 当然,所有这些都是自动化的。

现在,处理这个更大的编译器/字节码工具,事情就不是那么容易了。复制我用我的简单编译器所做的工作并非易事。我想要走的路是在这个阶段从系统测试中恢复过来,专注于单元测试。


任何编译器开发人员都知道,编译器由许多访问者组成。我不太确定如何对它们进行单元测试。据我所见,大多数访问者都在调用具有与该访问者相关的方法的对应类(我想这个想法是为访问者保留 SRP)。

我可以采用几种技术对编译器进行单元测试:

  1. 分别对每个访问者的方法进行单元测试。对于无堆栈的访问者来说,这似乎是一个好主意,但对于使用一个(或多个)堆栈的访问者来说,这似乎是一个糟糕的主意。然后,我还以传统方式对标准(读取,非访问者)类中的每个其他方法进行单元测试。

  2. 一口气对整个访问者进行单元测试。也就是说,我创建了然后访问的树。最后,我验证符号表是否正确更新。我不关心嘲笑它的依赖。

  3. 与 2) 相同,但现在模拟访问者的依赖项。

  4. 还有什么?

我仍然有一个问题,即单元测试将与 sabbleCC 的 AST 紧密耦合(这真的很难看)。


我们目前没有进行任何新的测试,但我想让火车重回正轨,因为我确信不测试系统就像喂一只迟早会回来咬我们的怪物一样当我们最不期待的时候对接;-(

有没有人有任何编译器测试的经验,可以就现在如何进行提供一些令人惊叹的建议?我有点迷路了!

0 投票
1 回答
1460 浏览

antlr - 用于 DSL 实现的 ANTLR 或 SableCC?

是否有人将这两种语言都用于语言实现并能够比较它们,指出优缺点?我寻求一个支持 AST Walker 代码生成的 RAD 工具。SableCC 是 LALR,因此支持“左递归”,而 ANTLR 是 LL(*)。这对典型的语法或 DSL 很重要吗?我还需要执行一些特定领域的分析。(我的编译器的目标语言是 OpenCL C)。因为这将是一个学生项目,所以重要的是我不会在繁琐的方面浪费太多时间,即实现语言的前端。

0 投票
1 回答
465 浏览

lexer - Sable CC 解析器生成器的产品

它看起来很基本,但在过去的半个小时里,我不知道我们为什么说{zero}{one}在以下作品中 {} 表示什么?

0 投票
1 回答
249 浏览

java - 如何从java中的文件中获取类似EOF符号的smth

今天是个好日子。

我正在使用sableCC,它需要一个 Reader 对象作为输入。例如,此代码可以正常工作:

因为 StringReader 在字符串结束后返回 -1:

给出:

但是当我将相同的字符串写入文件“prog”时,没有任何额外的行或字符,并在其上创建 FileReader,编译器会在不存在的第二行中断,因为 FileReader 返回换行符而不是 -1 字符:

给出:

从文件阅读器获得与从 StringReader 相同的行为的最短方法是什么,或者 SableCC 允许旁观?