问题标签 [lalr]

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 投票
2 回答
249 浏览

grammar - 在 BNFC 语法中设置优先级

背景:

我正在学习软件语义方面的课程,我们应该为一种名为while的玩具语言创建一个小型编译器和运行时。我们得到了 Java 的代码框架,但我们可以使用任何我们想要的语言。我认为这是一个排练语法的机会,并认为用 C++ 进行实验会很酷。

现在,我在为我的语句设置优先规则时遇到了一些问题。这是我现在的BNFC语法文件:

我想要的是输入

根据我的复合规则解析成类似的东西

也就是说,我希望分配不是循环体的一部分。但是,我得到的是

如您所见,while 循环的主体由复合语句组成,这不是我想要的。我应该如何设置我的优先规则来达到这个效果?

0 投票
2 回答
591 浏览

parsing - 有没有办法使这个语法 LALR(1)?

我有这样的规则语法

有没有办法把这个语法变成 LALR(1)?据我所知,如果解析器p在块内看到,则存在移位/导出冲突。

0 投票
4 回答
2431 浏览

c# - C# 的 lambda 表达式语法是 LALR(1) 吗?

我想问的问题在标题中简洁地给出了。让我举一个有问题的语法的例子:

然后我们添加正常的 C 表达式语法 - 特别是,

真正的问题是,这个语法 LALR(1) 是否可解析,即能够被自动解析器生成器解析?还是需要手动或 GLR 解析器?请注意,我希望具体了解本小节,而不是上下文相关的关键字内容或任何其他部分。

我现在在想的是,如果解析器看到'(' identifier ')',这有两个有效的解析,所以如果解析器看到identifier,向前看')',它将无法决定要关闭哪个解析树。不过,这可能只是一个 shift/reduce 冲突,我可以通过分配一些任意优先级(可能是 favouriing '(' identifier ')')来消除它。

编辑:实际上,我正在考虑使用语法的这小节来窃取新语言的类似功能。我已经有语法形式类似于 JavaScript 的匿名函数,但我的豚鼠尖叫反馈抱怨它们对于许多用途来说过于冗长,并指出 C# lambda 表达式是更理想的解决方案。我担心此解决方案可能导致歧义。所以,真的,我只对那个小节感兴趣。泛型和演员表等其他东西对我来说不是问题。

我以前的语法版本是机械可解析的,我不想失去这个属性,而我以前使用机械生成器的经验告诉我,最好在这里检查而不是自己尝试。对于我的手动解析器,我当然可以简单地在特殊情况下'(' identifier向前看比正常情况更远一些。

0 投票
1 回答
225 浏览

parsing - LALR(1) 语法如何区分变量和函数调用?

给定以下输入:

LALR(1) 语法有什么方法可以避免移位/减少冲突?转移/减少冲突决定减少y或继续减少(

(这是假设变量名可以是任何字母数字字符集,而函数调用是括号后的任何字母数字字符集。)

0 投票
1 回答
267 浏览

parsing - 用于字符串连接的 LALR 语法

我一直在尝试解析连接的字符串,以便表达式也可以连接起来形成字符串。那是,

上面应该正确解析。问题是这+会导致减少班次的冲突。我一直在使用以下语法;

我在尝试找到+不会导致移位减少冲突的语法方面没有任何成功。我希望有一种方法可以制作这种语法 LALR,我非常感谢在尝试找到它时提供的一些帮助。

0 投票
1 回答
1002 浏览

algorithm - 有没有一种通用的方法可以将明确的上下文无关语法转换为 LALR(1) 语法?

我正在尝试为以下语法创建一个 LALR(1) 解析器并找到一些移位/减少冲突。

冲突

所以解析器无法正确解析字符串“ID[ID]”。我的问题是,

  1. 是否有任何通用方法可以将此类非 LALR(1) 语法转换为 LALR(1) 语法?
  2. 如果两个文法生成完全相同的语言,并且我们知道其中一个不是 LALR(1),我们能否知道另一个是否是 LALR(1)?

上面提到的语法只是一个例子,我真正想知道的是解决这些语法问题的一般方法。欢迎任何建议或阅读建议。

提前致谢。

0 投票
0 回答
334 浏览

parsing - LR(k) 解析表构造:是否可以按需计算前瞻集?

我已经开始阅读有关 LR(k) 解析表构造的内容,所有解释 k > 0 算法的文本都建议在生成项目集之前为每个符号计算前瞻,然后在生成所有项目集时,应该合并多余的以生成最小的解析表。

考虑以下伪状态/项集构造例程:

  1. 首先假设可以在没有前瞻的情况下确定状态转换(k = 0)
  2. 计算当前状态的整个项目集
  3. 尝试确定当前状态动作:
    • 如果集合中只有一个项目并且它已经消耗了所有输入(rhs 右侧的标记,则操作减少到项目的 lhs。
    • 如果集合中的每个项目都需要输入,则动作是转移并进入下一个状态
    • 如果有些项目需要输入而有些则没有,这是一个移位/减少冲突
    • 如果两个或多个具有不同 lhs 的项目到达输入末尾,这是一个减少/减少冲突。如果发生了最后两种情况之一,这意味着我们需要在决定状态动作之前先看一下。将 k 增加 1 并返回步骤 2。
  4. 如果动作要转移,则通过模拟输入组合(如果 k > 0 则为前瞻)继续创建后续状态,并为每个新状态返回步骤 1。

使用上述步骤为任意 LR(k) 语法构建表是否可能/可行?如果没有,我错过了什么?

0 投票
3 回答
22923 浏览

parsing - LALR 和 LR 解析有什么区别?

我知道 LR 和 LALR 都是自下而上的解析算法,但两者有什么区别?

LR(0)、LALR(1) 和 LR(1) 解析有什么区别?如何判断语法是 LR(0)、LALR(1) 还是 LR(1)?

0 投票
1 回答
123 浏览

java - 通过accj转移/减少冲突

我在这个简单的正则表达式解析器中遇到了移位/减少冲突。我是yacc的初学者,我似乎有点困惑。这是我到目前为止所写的:

我的解析器类的名称是YYRegExParser,现在它应该只识别简单的 ID(字母数字符号)和两个正则表达式之间的连接。但是,即使我的输入正确,第二条规则也永远不会匹配

0 投票
1 回答
3986 浏览

parsing - CUP LALR 解析器生成器:警告:生产从未减少

这是我第一次使用 CUP 解析器,我不断收到以下错误:“警告:*生产”...“从未使用过。我不知道出了什么问题,请帮忙。请参阅附加的代码和错误日志下面,谢谢。

错误日志: