问题标签 [treetop]

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 投票
1 回答
72 浏览

ruby - Treetop 似乎在一个简单的语法上失败了(5 条规则)

我正在尝试为 C 的一个子集编写一个解析器。

在这种简单(进一步简化)的语法上很难分析树顶的行为。

我的测试用例是“int main(){}”

来自树顶的错误消息是:

因此,问题在于标识符规则......

树顶的版本:1.5.3 和 Ruby 2.1.1

任何想法 ?

0 投票
1 回答
164 浏览

ruby-on-rails - 编写 Treetop 规则以任何顺序解析输入

我正在寻找一种编写 Treetop 规则的方法,该规则将以任何顺序找到一些值。所以:

我想解析这些输入:

我怎样才能做到这一点?谢谢

0 投票
1 回答
134 浏览

ruby - 使用 Citrus 解析表达式语法的堆栈级别太深

我正在尝试使用类似于 Treetop 的 Citrus for Ruby 中的语法来处理最终将成为布尔逻辑的内容。我遇到了递归问题,但我不清楚具体原因。这是我要处理的文本(最后应该有一个换行符):

这是我的 Citrus 语法(旨在处理更高级的东西):

重要的事情在规则expr和规则or_expr中。我已经改变了or_expr,所以它匹配除了评论之外的所有内容。如果我坚持当前的expr规则,我会得到堆栈溢出。但是如果我切换它,它就没有 or_expr 和 gtor_expr 之间的选择它工作正常。

我对“选择”的理解是它将尝试按顺序评估它们。如果第一个选择失败,那么它将尝试第二个。在这种情况下,第一个选择显然能够成功,那么如果我包含一个永远不应该采用的第二个选择,为什么会出现堆栈溢出呢?

0 投票
1 回答
749 浏览

ruby - Ruby & Treetop - 没有这样的文件或目录 @ rb_sysopen

我正在尝试学习使用 Treetop PEG 语法解析器,但我从一开始就遇到了奇怪的错误。

我有这个文件结构

文件内容如下(列表按上面列出的文件顺序)

node_extensions.rb

解析器.rb

tranlan.treetop

当我运行 parser.rb 时,我收到此错误

怎么了?有什么帮助吗?

0 投票
1 回答
166 浏览

ruby - 树顶解析器错误处理机制提供无用的输出

我最近一直在尝试使用 Treetop 为我的一位客户创建用于 CFG DSL 语言的简单解析器。我成功地实现了他需要的所有功能,但与 Treetop 一起工作却是一段非常痛苦的经历。

问题是我无法从 Treetop 获得任何可用的错误消息。我得到的唯一输出是

它总是指向文件中的第一个字符。在解析的语言中发现任何错误真的很糟糕。如果我找不到任何问题,我应该如何逐步开发我的解析器?

我试图改变我的语法以包含递归规则,因为我认为这将有助于解析器尽快创建 AST 节点,但它没有帮助。

我的问题是:我做错了吗?有没有什么好的例子如何为 Treetop 创建 PEG 语法,它在部分派生的树上提供有意义的错误消息?还是 Treetop 库中的错误/错误?

感谢您的任何意见。

0 投票
1 回答
42 浏览

peg - 遇到简单的树顶语法问题

我正在玩树顶游戏,但我无法使用简单的语法来生成我期望的 AST。

我的规则是

1:LINE 可以由一个或多个 PIPED COMMAND 组成,用 ; 分隔 2:一个 PIPED COMMAND 是一个或多个由 | 分隔的 COMMAND 3:一个命令是一个或多个由空格分隔的标识符

我期待这样的树

生成这样的树

但是,即使只是正确返回管道命令,我也无法得到它,如果我指定超过 2 个,结果就会混乱

语法目前看起来像:

希望有人可以提供一点帮助!

谢谢

0 投票
1 回答
207 浏览

ruby-on-rails - 从简单的树顶解析器获取日期部分:错误的参数类型类(预期模块)

对于以下树顶语法,在解析“3/14/01”(通过t = Parser.parse('3/14/01')irb)时,我得到一个“TypeError:错误的参数类型类(预期的模块)”。

首先,如果我注释掉<MonthLiteral><DayLiteral>类引用,一切都很好。注释掉<DateMDY>,但保留那些 Literal 对象,也会发出错误。注释掉<YearLiteral>似乎无关紧要(不管它会起作用还是不起作用)——这似乎表明因为前两个是非终端的,我不能为它们生成元素。

很明显,对于 Ruby(或树顶)如何实例化这些类或关于 AST 生成可以解释会发生什么,我并不欣赏。你能解释或指出一些可以帮助我理解为什么<MonthLiteral><DayLiteral>不能生成对象的东西吗?

其次,这可能是一座过分的桥梁,但我真正喜欢的是获得一个DateMDY具有三个属性的对象——月、日和年——这样我就可以很容易地从中Time的方法生成一个 Ruby 对象,但是现在我会满足于将组成部分作为对象来生产。to_timeDateMDY

所以我尝试<DateMDY>作为对象离开并注释掉对<MonthLiteral>,<DayLiteral>和. 的引用<YearLiteral>。我看到从.parse(t在我的原始示例中) 返回的结果 AST 对象有两个公共方法——但是当我调用这些方法时:day_part:month_part这些方法似乎是 nil (比如puts t.day_part) 并且没有:year_part方法,所以这似乎没有帮助我出去。

是否有可能以某种方式DateMDY最终访问其组成部分?

仅供参考,Parser我使用的代码本身是树顶教程中非常标准的东西node_extensions.rb,定义对象类的代码也很简单,但如果您需要查看这些代码,我也可以发布它们。

谢谢!理查德

0 投票
1 回答
110 浏览

ruby - 为什么有时在 Treetop 语法中发出空字符串而不是自定义节点?

关于我使用 Treetop 的一个反复出现的问题,我希望得到您的建议,我无法解决……有时。我可能错过了一些东西。

我怀疑你们中的许多人都有正确的习语或习惯来解决这个问题。

我通常使用 Treetop,如下所示:

  1. 我在 .tt 文件中定义我的语法
  2. 我修改它以发出自定义解析树对象(继承 Treetop::Runtime::SyntaxNode)。这些类在“parsetree.rb”文件中定义。
  3. 这些自定义对象有一个 to_ast方法,可以将它们递归地转换为“纯”树顶独立类(构成我的最终 AST)。为此,我有两个单独的模块(ParseTree 和 AST)。

但是,我遇到了一条经典的错误消息,我通常无法修复:

我在这里感到困惑,因为似乎发出了一个空字符串“”而不是我的自定义节点之一。

在这个例子中,在这行 380 我有以下代码(它是关于一个有限状态机)

我与错误有关的语法是:

0 投票
1 回答
137 浏览

ruby - 树梢语法续行

我正在尝试为如下语言创建语法

正确解析前面代码的正确 Treetop 语法规则是什么?

我应该能够为三个变量提取以下值

  • 这是一个字符串,我知道它没有双引号
  • 这个字符串有一个延续,这意味着我可以像这样在多行上写它
  • 这个字符串被引号包围

谢谢

0 投票
1 回答
354 浏览

ruby - 树顶布尔逻辑运算

我正在实现具有语法的 DSL:

每个关键字都将转换为布尔 ( true, false) 值,之后应使用运算符进行计算 and, or, not

我当前的语法规则只匹配字符串[keyword] or [other keyword]并且在 stings 上失败[keyword] or [other keyword] or [one more keyword]

如何编写与任意数量的or,and结构相匹配的语法?

语法:

更新

解析器类

节点扩展