问题标签 [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 投票
1 回答
114 浏览

compiler-construction - 使用野牛进行范围界定的语言编译器

我正在尝试为基于 C 的自定义语言制作一个编译器,该编译器支持使用 C++ 和 flex + bison 对变量进行范围界定。我已经制作了一个词法分析器和解析器,但我在解决范围界定问题时遇到了麻烦。我在野牛解析器文件中实现了语义动作,例如

我遇到的问题是找到将新符号表放入上下文符号表堆栈的时刻。由于它是一个自下而上的解析器,我不知道新块何时开始,就在它结束时,在执行归约之后,对我来说为时已晚。我放在规则后面的代码在减少后被执行。

如何使用野牛解决这个问题?我现在正在头脑风暴一段时间,没有解决方案。谢谢。

0 投票
1 回答
395 浏览

parsing - 解决 LALR 歧义

我最近对 ​​LALR 的了解足以编写一个LALR 生成器,并且我正在尝试为它构建一个 java 或 c# 样式的语法(这里指定了它的开头)。

我知道编写解析器生成器需要付出额外的努力,比如重新发明轮子(为什么不使用 Antlr?),但我的目标是引导一个爱好操作系统,它可以在不依赖第三方工具链的情况下自行编译。我的问题不在于生成器,而在于语法。

我遇到了减少/减少语句和表达式的歧义。

我知道如何解决某些类型的歧义,例如 dangling-else,但是这几个对我来说并不直观,他们让我难过。

解决这些问题的最佳方法是什么?另外,是否有可以用来帮助可视化解决方案的原型制作工具?或者,我应该回到第一方并尝试为语法实现 GLR 解析器生成器吗?

这些声明是合法的:

这是它的设置方式:

因此,当解析器期待一个语句时,*LR(k) 项集内核是method-body -> { * stmts-opt }并且状态的完整项集看起来像这样:

当标识符移动时,下一个状态是:

它被解析或减少,并将下一个状态带到:

潜在的冲突。在父状态中,前瞻没有帮助,因为nested-nameand中有一个点primary-expr。哦,天哪,让我们尝试通过嵌套名称减少:

这里没什么可看的......现在,改为减少如何primary-expr

现在当我们 shift ++ 时,我们得到:

...另一个减少 - 减少冲突。

让我们尝试改变(而不是ident

ident将or(移到堆栈上时也会出现同样的问题。

这些只是我到目前为止遇到的那些。由于basic-name优先于rel-expr,我假设类似的东西x < n会被解释为basic-name -> ident < type-list *,如果它实际上是一个关系表达式,则会出错。

我的大脑已经到了可以真正需要一些帮助的地步。

0 投票
1 回答
73 浏览

c - 尝试通过改变语法来解决 Shift 减少冲突

给定以下语法规范:

这些是我想出的用于 YACC/BISON 程序的规则。不过,我有 Shift/Reduce 冲突。

也试过这个语法:

也没有工作。还是有矛盾。(虽然这通过了我设置的测试用例)

这也没有:

有什么帮助吗?

0 投票
0 回答
115 浏览

parsing - 无法设置优先规则以强制转移 Jison

我正在尝试用我的语言实现一个功能,您可以在通过执行返回函数后执行语句return someVal then someCode()

对于 return 语句,我有以下语法:

在 Jison 文件的标题中,我有以下优先规则:

我知道当存在冲突时,Jison 默认会转移,但我想设置优先规则,这样我就不会在 Jison 中收到转移/减少冲突警告。我认为将最后一条规则设置为优先于所有其他规则会这样做,但我得到了这个:

任何通过优先规则解决此问题的帮助将不胜感激。

先感谢您!

0 投票
1 回答
80 浏览

compiler-construction - 如何理解非 LR(0) reduce state in A pratical method for Construction Effective LALR(k) Parsers with Automatic Error Recovery

这是术语

我不明白非 LR(0) 减少状态的来源。这是否意味着:

  1. 移除 LR(0) reduce 状态和 get LR'(0) states
  2. 使用 LR'(0) states 来生成一个 LR(K) states 。而非 LR(0) 归约状态来自 LR(K) 状态。

这是A patyical method for cnstructing Effective LALR(K) Parders with Authomatic Error Recovery的副本

请阅读第 4.2 章

0 投票
1 回答
46 浏览

compiler-construction - 为什么 JDT 解析器在状态为 shift-reduce 时不弹出元素?

根据
第 4.2 章中构建具有自动错误恢复功能的高效 LALR(K) 解析器的实用方法。

当解析器遇到 shift-reduce 时,它​​应该弹出 |α| 元素。但是 JDT 中的解析器并没有弹出元素。我不知道为什么,有没有人可以帮助我。

parser.java 中的 shift-reduce 操作 在此处输入图像描述

DiagnoseParser.java 中的 shift-reduce 操作 在此处输入图像描述

0 投票
2 回答
171 浏览

bison - groff 的语法是 LALR(1) 吗?

作为一个宠物项目,我正在尝试使用Jison(Bison 的 JavaScript 克隆)制作一个 groff 解析器,但我正在努力弄清楚 groff 的语法是否为 LALR(1)。

有没有人对此有所了解?

提前致谢。

更新 1

为了回应布赖恩的担忧,以下是有关我的问题的更多详细信息:

0 投票
1 回答
1331 浏览

parsing - CLR 解析中的冲突

这是语法:

我在 CLR 中解析然后减少/减少冲突出现。接下来做什么?我在下面附上了我解决的问题。

解析表

这是过程

0 投票
2 回答
608 浏览

c++ - 制作 C++ 解析器时的歧义解析

我为 C++17 编写了一个 LALR(1) 解析器。我发现了156个歧义,其中一些我可以根据标准解决它,但其他我不能。

例如:当遇到小于时,在解析“ operator+ < ...... ”时发生 Shift-Reduce 冲突:

我们可以将其解析为:

(1)

模板 ID -> 操作符函数 ID · < ...... >

或者:

(2)

unqualified-id -> operator-function-id · 其中 (1) 需要移位但 (2) 需要减少。

但是,该标准具有:

在名称查找 (3.4) 发现名称是模板名称或 operator-function-id 或literaloperator-id 引用一组重载函数后,其中任何成员都是函数模板,如果后面跟着一个<,< 总是作为模板参数列表的分隔符,而不是小于运算符。解析模板参数列表时,第一个非嵌套 >137 被视为结束分隔符而不是大于运算符。

所以我们选择转移。

不幸的是,有很多歧义我找不到解决方案。在这里,我列出了其中的一些(其中一些可以清楚地做出选择,但我就是找不到证据):

  1. 当出现歧义时,标准中是否有某些部分表明“转移”是默认选择?

声明者

(1)当解析一个 noptr-declarator 并遇到一个左括号时,我应该根据以下方式减少它:

ptr-declarator -> noptr-declarator ·

或移动左括号以满足:

declarator -> noptr-declarator ·参数和限定符

parameters-and-qualifiers -> · left-paren parameter-declaration-clause right-paren......

(2)当解析一个declarator-id遇到左括号时,我应该按照以下方式减少它:

noptr-declarator -> declarator-id · noptr-declarator -> noptr-declarator · \left-bracket ?constant-expression \right-bracket ?attribute-specifier-seq

或移动左方以满足:

noptr-declarator -> declarator-id ·attribute-specifier-seq

(属性说明符序列为 [[.......]])

0 投票
2 回答
151 浏览

parsing - 解析每行以特定符号开头的块

我需要解析一个如下所示的代码块:

这很容易做到:

现在我想知道,如何添加嵌套块,例如:

这可以表达为LALR语法吗?

当然,我可以解析顶级块,然后再次运行我的解析器来处理这些顶级块中的每一个。但是,我只是在学习这个主题,所以避免这种方法对我来说很有趣。