问题标签 [lemon]
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.
lemon - 如何让 Lemon 在 file.h 中定义终端标记,而不在任何减少规则中使用该标记?
我在 Ragel 中实现了我的词法扫描器,当我识别各种空白时,我需要一个令牌来使用。但除了分离其他标记之外,我不关心空白。如果我将它传递给我的 Lemon 解析器,我将不得不插入许多额外的规则来摆脱它,这将使我的语法变得丑陋并减慢解析速度。但是我发现让 Lemon 生成空白标记的唯一方法是放入我从未打算使用的 reduce 规则。
目前,我有一个list0 ::= .
允许空列表的规则,所以我添加了一个list0 ::= SP.
. 有没有更简洁的方法来声明一个令牌,而不在减少规则中使用它?
lemon - 柠檬是否正确处理非关联优先级?
我觉得柠檬解析器生成器在非关联优先级上做错了。我有一个简化的语法来展示我所看到的问题。
产生这样的冲突报告:
如果我告诉它 equals 是左关联的,那么问题就消失了。就好像 nonassoc 没有将规则放入优先级集中。与该语法的 Bison 版本相比,没有冲突。分配确实应该是非关联的。为了解决这个问题,我宁愿不撒谎。
parsing - Bison/YACC vs. Lemon vs. 标准输入
我正在尝试将计算器从 Bison 转换为 Lemon。
我遇到了一个涉及标准输入的意外问题,其中两个程序的行为完全不同。Bison 版本在按下 [Enter] 后立即打印结果。在 Lemon 版本中,结果会延迟,直到我键入新表达式并按 [Enter]。
我创建了微型 Bison 和 Lemon 语法以及 Flex 扫描仪来说明问题。这是在 Windows 7 上,使用 2014 年 7 月版本的 Lemon、Bison 2.41 和 gcc (tdm64-2) 4.8.1。
Bison 版本的简单会话
请注意在简单表达式后按 [Enter] 后如何返回结果。
Lemon 版本的简单会话
请注意,仅在输入第二个表达式并按 [Enter] 后才返回结果(ctrl Z 表示 cmd.exe 的输入结束)。
我做错了什么?
Bison/Flex 版本源码
坏的.l:
坏的.y:
构建:
Lemon/Flex 版源码
小伙子
小伙子:
主.c:
构建:
ios - 使用 Lemon(和 Core Foundation)解析 JSON
我正在尝试使用 Lemon 和 Apple Core Foundation 编写一个简单的 JSON 解析器。
这是到目前为止的代码:
使用这样的简单 JSON
我不能超越成员规则(此时,字典设置正确)。
永远不会调用对象规则,而json ::= 对象也是如此!
我在做傻事吗?
任何输入将不胜感激!
c++ - C++ 中 Lemon 生成的解析器的分段错误
我试图弄清楚 Lemon 解析器生成器,所以我写了一个小测试来帮助自己完全理解。文件生成没有问题,编译器没有抱怨,但是当我尝试运行它时,我得到一个分段错误。我究竟做错了什么?
词典.l:
语法.y:
主.cpp:
AST.h:
AST.cpp:
最后是测试输入:
和输出:
c++ - 从未在柠檬生成的解析器中声明自定义类成员导致编译错误
我正在尝试学习如何使用 Lemon 解析器生成器,并且我建立了一个学习项目。但是,当我尝试编译源代码时,我从 GCC 收到了一些奇怪的错误。看起来可能有一些文本转录问题或拼写错误,但我找不到。我正在使用 C++11 标准进行编译。文件“log”包含编译器输出。
我编译
AST.h
语法.y:
词典.l:
主文件
日志:
parsing - 使用带有自定义标记值的 Lemon 解析器
我正在将旧语法移植到柠檬中,并且我已经在头文件中定义了所有终端符号;我想将它们与这些值一起使用,而不是柠檬在 parser.h 中生成的值:这可能吗?
覆盖 parser.h 完全没用,因为这只是内部发生的事情的镜像,匹配的值将保持不变。
(由于柠檬与野牛共享很多代码,我认为野牛的解决方案也可以解决柠檬的问题)
parsing - 在 Lemon 中使用 midaction 规则来解释“let”表达式
我正在尝试使用 Flex + Lemon 编写一个“玩具”解释器,它支持非常基本的“let”语法,其中变量 X 临时绑定到表达式。例如,“letx 3 + 4 in x + 8”应计算为 15。
本质上,我“喜欢”的规则是:
但这不起作用,因为在分配O
之前进行了评估。X = N
我知道通常的解决方案是中间规则行动。Lemon 没有明确支持这一点,但我在其他地方读到过无论如何都只是语法糖。
因此,我尝试制定一个中期规则行动,X = N
在解释之前完成我的任务O
:
但这不起作用,因为midruleaction
规则无法访问N
,或者至少我在柠檬文档/示例中看不到。
我想我在这里遗漏了一些东西。我知道我可以建造一棵树,然后再走一遍。我可能最终会这样做,但我想先了解如何更直接地解决这个问题。
有什么建议么?
parsing - 为什么柠檬不立即执行终端?
我正在使用 flex 和 yacc 将一个小型线程解释器移动到 re2c 和柠檬。一切正常,但文字。
为什么与文字相关的操作无法像使用 yacc 一样运行?我期望“1.0 end”但得到“0.0 end”
dsp语法
主程序
生成文件
c - 如何使用柠檬处理带有变量的表达式
我想实现这样一个程序:它读取一些包含一些变量的表达式。这些变量将在稍后设置,程序应该计算最终结果(如 sql 准备语句)。
例如,表达式可能像$foo + $bar + 2
,我需要在后面设置$foo
和时计算结果。$bar
我正在尝试用ragel和lemon来实现它。我已经学会了使用ragel来解析表达式。但我不知道如何使用柠檬来处理变量并进行计算。
谢谢你的帮助。