问题标签 [ll]
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.
algorithm - 解析上下文无关文法
我知道自下而上的解析器比自上而下的解析器更好,因为它可以接受左递归语法,我们更喜欢自下而上解析而不是自上而下解析的其他原因是什么?
parsing - 函数式编程中的非递归预测表驱动 LL(1) 解析器
我想知道在函数式编程中构建非递归预测表驱动的 LL(1) 解析器的最佳方法是:Haskell 或 OCaML 中的手动编码,或者它是否存在可以帮助我解决这个问题的工具?
compiler-construction - 如何留下上下文无关语法?
据我了解,在以下情况下,构建自上而下的解析器需要左分解。但是很难理解如何做到这一点?有人可以在这里帮助我吗?谢谢。
haskell - Parsec:预测解析
我只有很少的 haskell 技能,我需要帮助如何使用 parsec 实现预测解析 (LL*)。
我有上下文无关语法:
基于http://research.microsoft.com/en-us/um/people/daan/download/parsec/parsec.pdf(章节预测解析器)我写了这段代码:
我希望这段代码尝试匹配'(',如果不是,解析器将继续并仅匹配标识符。此代码仅适用于匹配标识符'('args')'。
仅在标识符“a”上调用它会抛出:
compiler-construction - 具有 ANTLR 或 ANTLR3 的 LL(1) 表驱动编译器
是否可以使用 ANTLR 或 ANTLR3 创建 LL(1) 表驱动(非递归)编译器?
parsing - LL(1) 表驱动(非递归)生成器
请,需要帮助。我正在寻找一个 LL(1) 表驱动(非递归)生成器。在互联网上找不到任何东西。我发现的只是一堆 LR 或递归解析生成器 :( 在此先感谢。
ruby - 如何手动构建 AST?
我目前正在学习解析,但我对如何生成 AST 有点困惑。我编写了一个解析器,可以正确验证表达式是否符合语法(当表达式符合时它是沉默的,当它不符合时会引发异常)。我该从哪里开始构建 AST?我发现了很多关于构建我的 LL(1) 解析器的信息,但在构建 AST 方面却很少。
我当前的代码(用非常简单的 Ruby 编写,包括词法分析器和解析器)可以在 github 上找到:https ://gist.github.com/e9d4081b7d3409e30a57
有人能解释一下我是如何从目前拥有的东西变成 AST 的吗?
或者,如果您不熟悉 Ruby,但知道 C,您能否告诉我如何在递归下降解析维基百科文章中为 C 代码构建 AST。
请注意,我不想使用像 yacc 或 antlr 这样的解析器生成器来为我完成工作,我想从头开始做所有事情。
谢谢!
antlr - 如何在不使用 backtrack=true 的情况下解决此问题?
我正在尝试制作一种没有运算符优先级的语法,但要求您使用一个运算符或将它们括在括号中。(为简单起见,在此处使用而test
不是有效运算符列表)。例如:id|int_literal etc
+
有没有办法为此编写不需要回溯=真的语法?我不认为左分解在这里真的有意义,我不确定句法谓词会有什么帮助。
这是我所拥有的(需要backtrack=true
):
parsing - 使用 Scala 解析器的运算符关联性
所以我一直在尝试用 Scala 的解析器编写一个计算器,这很有趣,除了我发现运算符关联性是向后的,当我尝试让我的语法左递归时,即使它完全明确,我得到堆栈溢出。
澄清一下,如果我有这样的规则: def 减法: Parser[Int] = num ~ "-" ~ add { x => x._1._1 - x._2 } 然后评估 7 - 4 - 3 出来6 而不是 0。
我实际实现的方式是我正在组成一个二叉树,其中运算符是非叶节点,叶节点是数字。我评估树的方式是左孩子(运算符)右孩子。在为 7 - 4 - 5 构建树时,我希望它看起来像:
其中 - 是根,它的孩子是 - 和 5,第二个 - 的孩子是 7 和 4。
但是,我可以轻松构建的唯一树是
这是不同的,而不是我想要的。
基本上,简单的括号是 7 - (4 - 5) 而我想要 (7 - 4) - 5。
我怎么能破解这个?我觉得无论如何我都应该能够编写一个具有正确运算符优先级的计算器。我应该先对所有内容进行标记,然后再反转我的标记吗?我可以通过将右孩子的所有左孩子变成右孩子父母的右孩子并使父母成为前右孩子的左孩子来翻转我的树吗?它似乎很适合第一个近似值,但我并没有真正考虑过它。我觉得一定有一些我失踪的案例。
我的印象是我只能用 scala 解析器制作一个 LL 解析器。如果你知道另一种方法,请告诉我!
parsing - 使用预测解析器 LL1 解析器解决这个问题
使用预测解析器 LL1 解析器解决这个问题
E-> EOE | (五) | ID
O -> + /- / % /