问题标签 [recursive-descent]

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 回答
80 浏览

recursion - 给定对象的递归定义,如何编写递归识别器?

我正在为考试而学习,我无法理解这个概念,给定对象的递归定义,能够编写递归识别器。我不确定该怎么做。

这是一个示例问题:一个正整数是 2 的幂,如果它是 2 的幂的 1 或两倍。直接根据这个递归定义编写一个正整数的递归识别器,它识别正整数是否是 2 的幂2.

0 投票
3 回答
368 浏览

c# - C# 或 F# 用于解析类似 Slim 的缩进意识语言?

为了在 .NET 中为类似Slim的模板语言(用于 ASP)构建解析器,哪种语言更适合 C# 或 F#?(对我来说,F#似乎更科学,更适合此类任务..)

除了语言选择之外,这两种技术中的哪一种适用于解析语言,其中有 2 个空格递增缩进来描述嵌套/块(例如;Slim、Haml 或 SCSS):递归下降解析递归上升解析

OAN,.NET 中的 RDP 或 RAP 是否有任何 OOTB 支持?还是像 Java 的parboiled这样的通用、优雅的第三方解析库?

0 投票
1 回答
1277 浏览

parsing - 计算第一组语法?

我有这个语法,我自己计算了第一组,但我不确定如何展示我的工作,因为我发现向我展示的方法太混乱了,但我了解如何获取这些集合而不是如何展示我的工作。

语法如下:

我的第一组是:

0 投票
1 回答
815 浏览

parsing - 递归下降解析:高优先级一元运算符

我已经想出了如何优先实现二进制运算符,如下所示(伪代码):

所以当我解析4 + 5 * 6它时:

      1. 数量(4消费)
    1. plus_t 消耗
      1. 数量(消耗 5 个)
      2. times_t 消费
      3. 数量(6消费)

但是,当我尝试添加一个minus方法时(前缀减去 like -4,而不是中缀减去 like 4 - 5):

它需要非常低的优先级,因此-4 + 5变得-(4 + 5)而不是(-4) + 5,这是不可取的。

我该怎么做才能制作高优先级一元运算符?

0 投票
1 回答
487 浏览

indentation - 具有缩进和回溯的递归下降解析器

我一直在尝试找到一种递归下降解析器算法,它也适用于带有回溯的缩进。但我一直让自己为此寻找麻烦的解决方案。

是否有任何资源也可以处理缩进?

谢谢

0 投票
1 回答
623 浏览

c - K&R C 第 5 章 dcl 问题

我已经读到了 K&R C 第二版的第 5 章,这是关于指针的。到目前为止,我做得很好并且理解了一切,但由于某种原因,我很难理解练习 5-18 的要求:“让 dcl 从输入错误中恢复”

听起来很简单,但这个问题期望我走多远?只是缺少括号,缺少换行符等?我很高兴知道其他人是如何解决这个问题的。谢谢。

0 投票
1 回答
181 浏览

ruby - 在使用正则表达式匹配字符串的递归下降解析器中计算行数?

我正在用 Ruby 编写一个递归下降解析器,它使用正则表达式来匹配终端。终端实际上​​是正则表达式,并与字符串中的当前位置匹配。

问题是终端正则表达式可以包含任何内容,包括匹配换行符的正则表达式。例如,匹配括号之间任何内容的终端/\([^\)]*\)/将消耗空格,包括我需要计算的换行符。我想出了几个解决方案,但它们都有我不特别喜欢的缺点:

  1. 每当匹配终端时,计算匹配中所有出现\n的次数。这实际上意味着每个字符串匹配两次而不是一次,

  2. 我可以不存储当前行,而是存储字符串的当前位置,仅在需要时通过遍历字符串来获取行号和列号。显然是有问题的,因为每次需要行号时都会遍历整个字符串。

  3. 除了允许正则表达式作为终端,我可以允许更简单的匹配器形式,类似于 ANTLR 允许的,然后手动匹配字符串,计算换行符。但是,这将需要大量的额外工作,并且会损失正则表达式所具有的匹配能力。

我倾向于第三种解决方案,但是我想看看是否有人处理过类似的问题并且有更好的解决方案可以为我省去麻烦。

0 投票
1 回答
6722 浏览

parsing - 表达式解析器语法和左结合性

我一直在尝试为带有变量的表达式创建解析器并将它们简化为二次表达式形式。

这是我的解析器语法:

对于解析,我使用递归下降解析器。假设我想解析这个:

“ 2 - 1 + 1 = 0”

结果为 0,解析器创建错误的树:

我怎样才能使这个语法左结合?我是这方面的新手,请你告诉我在哪里可以找到更多信息的来源?我可以使用递归下降解析器来实现这一点吗?

0 投票
3 回答
643 浏览

c++ - 递归表达式类中的 C++ 运算符重载

我有一个递归类Expression,它表示类似布尔的表达式,例如:

请注意,Expression它同时处理一元和二元表达式。基本上,Expression应该遵循类似于布尔表达式的CFG。

我以这种方式设计了课程:

构造函数的实现以及二元和一元运算符各一个如下所示:

该类无法编译

error: use of deleted function 'Fuzzy::Expression::Expression(const Fuzzy::Expression&)'

在每个重载的运算符中(在 return 语句中)。我觉得某些函数在内部尝试使用不存在的 unique_ptr 的复制构造函数。我在这里和那里移动指针有什么问题吗?我将 C++11 与 GCCv4.8 一起使用。

欢迎以任何方式对类接口的更改提出建议。我宁愿避免使用原始指针。

注意:请不要建议使用解析器生成器或类似的东西,例如 Boost.Spirit、YARD 或 YACC。该应用程序要求我从头开始实现它。

0 投票
2 回答
339 浏览

javascript - 实现一个基本的数学表达式简化器

我正在为我的 calc 类开发一个辅助项目,以区分像y=x^2Javascript 中的简单函数。为此,我将表达式解析为抽象语法树,然后硬编码衍生规则,如乘积规则和链规则。

唯一会用到的函数是 AP 微积分/第一年的微积分问题,所以三角函数、对数、指数都在起作用

我的程序很好地采用了导数,但我最终得到的是以一种荒谬的简单方式编写的函数。

例如,微分x^2给出(2*(x^(2-1))),这在技术上是正确的,但可以更容易地写成 2*x。到目前为止,我有一个基本的简化器,它基本上重复分析树,并应用一些基本规则。

我的一般程序是用递归下降来分析它。

如果当前树没有变量,则评估它并用结果替换当前节点。

否则,应用大量 if 语句来简化它。这包括像

  • 如果要乘以零,请将表达式替换为零
  • 如果要乘以 1,请将表达式替换为另一个操作数
  • 如果您要提高到 0 的幂,请将表达式替换为 1。

等等等等。如果我真的想要进行任何真正的简化,比如组合类似的术语,这将很快失控。另外,如果我想确定任何两个表达式是否等价,我最好的解决方案是在函数的域中简单地生成随机数,看看它们是否相等。然而,这似乎不是很有效。

我怎样才能更有效地确定两个不同表达式的相等性(一个简单的例子是x+2and 2+x),有没有办法在没有大量 if 语句的情况下简化函数?