问题标签 [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.
compiler-construction - 使用野牛进行范围界定的语言编译器
我正在尝试为基于 C 的自定义语言制作一个编译器,该编译器支持使用 C++ 和 flex + bison 对变量进行范围界定。我已经制作了一个词法分析器和解析器,但我在解决范围界定问题时遇到了麻烦。我在野牛解析器文件中实现了语义动作,例如
我遇到的问题是找到将新符号表放入上下文符号表堆栈的时刻。由于它是一个自下而上的解析器,我不知道新块何时开始,就在它结束时,在执行归约之后,对我来说为时已晚。我放在规则后面的代码在减少后被执行。
如何使用野牛解决这个问题?我现在正在头脑风暴一段时间,没有解决方案。谢谢。
parsing - 解决 LALR 歧义
我最近对 LALR 的了解足以编写一个LALR 生成器,并且我正在尝试为它构建一个 java 或 c# 样式的语法(这里指定了它的开头)。
我知道编写解析器生成器需要付出额外的努力,比如重新发明轮子(为什么不使用 Antlr?),但我的目标是引导一个爱好操作系统,它可以在不依赖第三方工具链的情况下自行编译。我的问题不在于生成器,而在于语法。
我遇到了减少/减少语句和表达式的歧义。
我知道如何解决某些类型的歧义,例如 dangling-else,但是这几个对我来说并不直观,他们让我难过。
解决这些问题的最佳方法是什么?另外,是否有可以用来帮助可视化解决方案的原型制作工具?或者,我应该回到第一方并尝试为语法实现 GLR 解析器生成器吗?
这些声明是合法的:
这是它的设置方式:
因此,当解析器期待一个语句时,*LR(k) 项集内核是method-body -> { * stmts-opt }
并且状态的完整项集看起来像这样:
当标识符移动时,下一个状态是:
它被解析或减少,并将下一个状态带到:
潜在的冲突。在父状态中,前瞻没有帮助,因为nested-name
and中有一个点primary-expr
。哦,天哪,让我们尝试通过嵌套名称减少:
这里没什么可看的......现在,改为减少如何primary-expr
:
现在当我们 shift ++ 时,我们得到:
...另一个减少 - 减少冲突。
让我们尝试改变(
而不是ident
:
ident
将or(
移到堆栈上时也会出现同样的问题。
这些只是我到目前为止遇到的那些。由于basic-name
优先于rel-expr
,我假设类似的东西x < n
会被解释为basic-name -> ident < type-list *
,如果它实际上是一个关系表达式,则会出错。
我的大脑已经到了可以真正需要一些帮助的地步。
c - 尝试通过改变语法来解决 Shift 减少冲突
给定以下语法规范:
这些是我想出的用于 YACC/BISON 程序的规则。不过,我有 Shift/Reduce 冲突。
也试过这个语法:
也没有工作。还是有矛盾。(虽然这通过了我设置的测试用例)
这也没有:
有什么帮助吗?
parsing - 无法设置优先规则以强制转移 Jison
我正在尝试用我的语言实现一个功能,您可以在通过执行返回函数后执行语句return someVal then someCode()
。
对于 return 语句,我有以下语法:
在 Jison 文件的标题中,我有以下优先规则:
我知道当存在冲突时,Jison 默认会转移,但我想设置优先规则,这样我就不会在 Jison 中收到转移/减少冲突警告。我认为将最后一条规则设置为优先于所有其他规则会这样做,但我得到了这个:
任何通过优先规则解决此问题的帮助将不胜感激。
先感谢您!
compiler-construction - 如何理解非 LR(0) reduce state in A pratical method for Construction Effective LALR(k) Parsers with Automatic Error Recovery
我不明白非 LR(0) 减少状态的来源。这是否意味着:
- 移除 LR(0) reduce 状态和 get LR'(0) states
- 使用 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 章
bison - groff 的语法是 LALR(1) 吗?
作为一个宠物项目,我正在尝试使用Jison(Bison 的 JavaScript 克隆)制作一个 groff 解析器,但我正在努力弄清楚 groff 的语法是否为 LALR(1)。
有没有人对此有所了解?
提前致谢。
更新 1
为了回应布赖恩的担忧,以下是有关我的问题的更多详细信息:
Groff 是用 C++ 编写的,不使用 Bison,我自己推导出语法。
我已经在这里上传了我的所有进度
parsing - CLR 解析中的冲突
这是语法:
我在 CLR 中解析然后减少/减少冲突出现。接下来做什么?我在下面附上了我解决的问题。
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)当解析一个 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
(属性说明符序列为 [[.......]])
parsing - 解析每行以特定符号开头的块
我需要解析一个如下所示的代码块:
这很容易做到:
现在我想知道,如何添加嵌套块,例如:
这可以表达为LALR
语法吗?
当然,我可以解析顶级块,然后再次运行我的解析器来处理这些顶级块中的每一个。但是,我只是在学习这个主题,所以避免这种方法对我来说很有趣。