问题标签 [leex]

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 回答
620 浏览

compiler-construction - 如何为 Erlang VM 编译

我正在尝试为应用程序中的用户脚本实现一种小型描述语言。基本上,用户描述了如何从其他对象创建对象。(不是真正的编程语言)。我也可以使用 JSON(但它会更冗长)。

我使用 leex 和 yecc,我有一个不错的解析树。说它是这样的:

有了这棵树,我想构建这样的东西:

但我不知道从哪里开始。我可以在运行时读取树并构建乐趣,但我真的想学习如何编译(并希望有更好的性能)。

我应该将我的解析树转换为 Erlang AST,然后编译 erlang 模块吗?

谢谢。

0 投票
2 回答
279 浏览

regex - 如何匹配leex中的行首?

根据leex 文档

^ 匹配字符串的开头。

但是当我尝试以某种模式使用它时,^[^\s\t-:]+[^:].*$我得到了这个错误:bad regexp 'illegal character ^'

有没有更好的方法来匹配一行的乞求?leex 中的字符串?

0 投票
1 回答
127 浏览

erlang - 无法让 Yecc 和 Leex 工作

我正在尝试创建一个非常简单的 DSL,它采用格式如下的字符串

把它变成类似的东西

我的 Leex 文件是这样的:

我的 Yecc 文件如下所示:

我得到的输出:

0 投票
1 回答
237 浏览

erlang - leex 是编写模板引擎词法分析器的好选择吗?

我正处于为 Elixir 实现类似 jinja2 的模板语言的初始设计阶段。我一直倾向于手动编写词法分析器,但最近我遇到了 Erlang 的 leex 模块。它看起来很有希望,但经过一些初步研究后,我不确定它是否适合我的目的。

我的一个犹豫是模板语言本质上是一种字符串嵌入语言,目前尚不清楚如何使用 leex 在这种情况下使用标记化。作为一个简单的例子,想象一下标记这个模板:

在此示例中,我需要确保关键字 ' for ' 和 ' in ' 的标记不同,具体取决于:

  • 如果它们在标签内:{% %}
  • 如果它们在标签内:{{}}
  • 如果它们在模板中,但不在任何标签内。

对我来说,这看起来我需要在标记化阶段进行两次传递,或者滚动我自己的词法分析器以便一次完成。

我想知道是否有任何有词法分析经验的人,尤其是 leex,或编写模板引擎可以提供一些关于最佳前进方式的见解?

0 投票
1 回答
174 浏览

erlang - 在 Elixir/Erlang 中使用 Yecc 解析器将项目附加到映射

我正在尝试在 Elixir 中使用 Leex/Yecc 解析特定的日志文件。几个小时后,我得到了最简单的工作方案。但是我想进行下一步,但我不知道该怎么做。

首先,这里是一个日志格式的例子:

我的简单尝试仅使用第一行,但它们的多个条目,例如:

这很有效,并给了我一张包含文本和日志行类型(警告)的漂亮地图:

那是完美的。但如上所示,日志行可以在下一行继续,用竖线字符表示|。我的词法分析器有管道字符,解析器可以理解它,但我想要的是下一行附加到text我的地图值。现在它只是作为字符串附加到地图中。所以而不是:

我需要:

我查看了网上的示例,但其中大多数都有非常明确的“结束”标记,例如结束标记或结束括号,然后我仍然不清楚如何添加属性,因此最终的 AST 是正确的.

为了完整起见,这是我的词法分析器:

还有我的解析器:

如果你能走到这一步,已经谢谢你了!如果有人能帮忙,那就更感谢了!

0 投票
1 回答
81 浏览

erlang - 在 leex 语法文件定义中,是否有一个正则表达式规则可以精确匹配 N 个元素?

查看 leex的文档,我没有看到完全匹配 N 个元素的示例,例如(element){n}

这失败了:

解决方法是这样的:

因此,如果我想匹配 3,000 个 foo,则定义ThreeThousandFoos = foofoofoo<2,997 more foos>将变得非常笨拙。有一些技巧,例如从较小的定义(例如SixteenFoos = {EightFoos}{EightFoos})构建越来越大的 foo 定义,但这似乎很愚蠢。

0 投票
0 回答
511 浏览

regex - 使用 flex、lex、leex 匹配严格的整个单词

我刚刚开始使用 leex 和 yecc 来为一个非常简单的控制外壳做词法分析器/解析器的东西。

我的词法分析器定义:

真的没什么。简单的情况下工作正常:

但这些一直困扰着我:

相反,我想要类似的东西:

但我不知道如何使用这些工具在单词边界进行匹配(它使用了一个苗条的impl。对于正则表达式 btw)

Ps:以防万一,我知道这不是正确的方法,但只是想知道是否可能以及如何

编辑 删除 lex 和 flex 标记,因为这似乎是 leex 的限制,而不是这些 *tools

0 投票
1 回答
48 浏览

elixir - 我可以让 Elixir 执行与变量匹配的引用代码吗?

也许这不是要走的路,但这是我最初的猜测,我愿意接受提示和更正。

一直在为我部分继承和扩展的简化查询方言编写解析器,允许用户编写如下内容:

plant where accession.code='2018.0047'

它还没有准备好,但是缺少的中间步骤很清楚,除了最后一个:我如何执行结果?

我的目标是等效Ecto.Query.from查询的报价表示。对于上面的例子,就我而言,等效的是:

我一直在研究__schema__函数返回的结构,一切看起来都很可行,我的意思是我知道如何从模块中提取表名,以及从给定名称的关联中提取所有者和相关模块和键,所以让我们假设我的解析器确实返回了这个值:

如何让 Ecto 执行它?

或者从 yecc 解析器生成 Elixir 代码的最佳方法是什么?