问题标签 [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.
ruby - 如何在 Ruby Treetop 树的子节点中触发函数。(原为:如何防止 ruby Treetop 进行 AST 挤压)
我一直在使用树顶。我写了以下规则
http://thingsaaronmade.com/blog/a-quick-intro-to-writing-a-parser-using-treetop.html
我可以解析我的整个输入字符串,但to_array
除了最初的函数之外,我没有其他函数被触发。
然后我找到了https://whitequark.org/blog/2011/09/08/treetop-typical-errors/,我发现AST squashing
我的规则也在做同样的事情。
我的第一条规则是
一切都被吞噬了body
。
有人可以建议我如何解决这个问题吗?
编辑 添加代码片段:
测试字符串
编辑:添加更多细节
测试代码签入: https ://github.com/justrajdeep/treetop_ruby_issue 。
正如您在我的node_extensions.rb
所有节点中看到的那样,Bodies
除了在方法中引发异常to_array
。但没有任何异常触发。
ruby - 在 Ruby Treetop 中使用 elements.map 时,如何处理 0 或多个语句中的非终端节点?
我正在尝试创建一个映射其所有非终端节点的自定义语法节点类。问题是其中一个节点不一定必须存在,这在自定义语法节点类中使用 elements.map 时会产生问题,因为语法节点树会为其创建 SyntaxNode: "" 代替,我有没有创建一个类。
例如,如果我尝试解析:“开始文档\n\nend 文档”。然后我希望这是一个输出:[“begin document”,“\n\n”,“end document”],但我收到错误消息:block in to_array': undefined method
to_array' for SyntaxNode offset=16, "":Treetop::运行时::SyntaxNode (NoMethodError)。
所以我做了一些进一步的调查,发现语法节点树确实在 offset=16 处包含一个 SyntaxNode "",我认为这是由于 (block twoOrMoreNewLines)* 不存在。
我该如何处理这个问题?有没有办法避免 SyntaxNode "" 被创建?
regex - 你怎么能要求一个未确定的字符在 Ruby Treetop 中连续重复一定次数?
我想创建一个规则,要求非数字、非字母字符连续重复三次。规则看起来像这样:
有没有办法要求它检测到的第一个字符重复三次?
之前有一个关于检测缩进数量的类似问题:PEG for Python style indentation
解决方案是首先初始化缩进堆栈:
然后保存当前行的缩进:
每当新行开始时,它都会像这样查看缩进:
如果缩进更大,它会将新的缩进级别添加到堆栈中。
我可以为我的问题创建类似的东西,但这似乎是一种非常乏味的解决方法。还有其他方法可以创建我的规则吗?
ruby - 树顶无限递归的简单算术语法
我正在尝试用 Treetop 编写一个简单的计算语法。为了简化这个问题的示例,我只使用变量、数字和+
运算符。我希望能够写出这样的表达式:
A
1
A+B
A+1
A+1+B
这是我的语法:
当我运行它时,它会无限递归。谷歌搜索了一段时间后,我认为我的问题与左递归有关,但我是解析器的新手,我不太明白这意味着什么。有人可以解释为什么我的特定示例不起作用以及如何解决它?
ruby - Visual Studio Code:禁用特定文件类型的错误/警告签入
在工作中,我的团队使用 Ruby 和 Treetop 解析器创建了我们自己的小型脚本语言。该语言本身的语法与 Ruby 非常相似。
我正在使用 Ruby 和 Ruby 扩展来突出显示我们的文件的这种语言的语法,但是 Ruby 扩展会引发错误,因为该语言实际上不是 Ruby。
有没有办法禁用特定文件类型的错误检查?我应该分叉 Ruby 扩展吗?
谢谢。