Pegjs: 论坛还是聊天? 向下传递值/向上弹出值?

创建于 2017-03-23  ·  7评论  ·  资料来源: pegjs/pegjs

pegjs 简单而强大。 我喜欢它! 我有一些文档中未涵盖的问题:

我正在解析这个,它有效,但规则似乎很尴尬:

f = x => x * x

如果我将其委托给 Operator,则无法向下传递值。 如果我创建 ValuesOperators 和 or = 和 =>,它会更清晰一些,但在顶层我仍然需要检查它是哪个。 在 JavaScript 示例中,我看到使用了 { type: "Literal", value: ... }。 这是传递信息的最佳方式吗?

  = values:Values body:(_ "=>" _ Expression)? assign:(_ "=" _ Expression)? {
      if (body && body.length > 0) {
        return new Function(values, body[3]);
      } else if (assign) {
        return new Assignment(values, assign[3]);
      } else {
        return values;
      }
    }

谢谢!
麦克风

最有用的评论

我假设没有回溯和贪婪意味着你必须“无论你现在在哪里”工作,但事实并非如此。 好极了!

贪婪只是意味着如果它找到匹配项,它就会接受它,对吗? 但是如果整个规则不匹配,它将在下一场比赛中从头开始。 这比我最初尝试这样做要容易得多。

x, y = 2 + 3.foo + "foo", 5 * 2

当赋值可以与正则表达式等分开匹配时,这相当容易。

  = Assignment
  / Expression

Assignment
  = vars:Variables _ "=" _ expr:Expression

Variables
  = head:Identifier tail:(_ "," _ Identifier)*

...

所有7条评论

在语法中,理解规则是必不可少的。 而你只提供sub .. 这对我来说不清楚,机器怎么能清楚?
LALR 语法很难写,但比 LR 容易,比 LL 容易。
PEG 语法容易写,但最难写得高效。
您确定您使用的是正确的玩具吗? 如果您有很好的 PEG 语法,您应该能够像解释规则一样轻松地创建转译器或解释器。

你知道虚拟机中的装箱/拆箱吗?

你怎么能在作业的左边有values ? 因为你有这个: body:(_ "=>" _ Expression)??

values在你的语法中是什么意思? 你知道什么是L值吗?

您必须在语义上保持语法接近。 在某些情况下很难使用 PEG.. { type: "Literal", value: ... }正是您在 AST 中所需要的。 看看http://astexplorer.net/它会是什么样子

我刚刚开始使用它进行实验,所以是的,有些命名是不正确的 :) 我已经编写了一些简单的 LL(1) 解析器,但是已经有一段时间了。 我只是很好奇处理决策的最佳方式是什么。 我将简化此语法:

a = b
或者
x => x * x

做这样的事情是否更合适?

赋值或函数
= ident:标识符操作符:IdentOperator {
if (operator.type === "函数") {
...
}

身份运算符
= "=" !">" { return { type: "Assignment"; } }
/ "=>" { ... }

仅供参考,“值”是我过去用来表示项目列表的术语——如果用作元组,它们将是值,但如果用于定义函数参数,则是变量。 例如 (2 + 3)。

谢谢你的时间!

@mikeaustin这是你的 :-)

编写语法就是关于归约。 最重要的是声明。 就像句子一样,你知道,你有 LL 语法 :-)

定义语法是你的责任(对不起,我有时英语有问题:-D)

您希望如何处理 AssignmentOrFunction? 这与许多语言中的语句基本相同,但也可以是R 值
另一方面

    = "=" !">" { return { type: "Assignment"; } }
    / "=>" { ... }

可以更好地写成

    = "=>" { ... }
    / "=" { return { type: "Assignment"; } }

可能是我错了..但这看起来你把你的句子分成不那么重要的片段。 没有上下文,您对此的评价并不重要。

PEG 真的很难写,因为你可以很容易地写出无法访问的规则,或者你可以写出会窃取你的句子并错误评估它们的规则,所以如果你是初学者,你应该一直在左边有句子,在右边有必要的 AST,十个比语法规则多倍的自动化测试。 相信我,你改变了一个规则,你的整个解析器就会破坏..

当然,你应该一次又一次地玩,写一些东西.. 用 PEG 编写有效的表达式计算器并非易事,注意几个优先级.. PEG 更适合一般解析。

你没有在你的问题中给我更多的上下文,所以很难猜测你真正想要构建什么,但我猜你应该更多地玩语法,有AntLR ,学习的好工具,GoldParser (LALR)(我的第一个玩具 :-) ),一些经过充分测试的老式解析器,最有效但被拆分为标记器/解析器(旧的 lex 和 yacc,新的 flex 和 bison),它们的许多端口..

PEG 看起来最简单。 确实如此。 但它永远是最危险的......

非常感谢! 哦,我确实找到了pegjs的Google小组,但没有注意到它,因为它在开发部分。 如果我有其他问题,我肯定会去那里。

是的,赋值 "x = y" 是一个 _statement_,但 "x => x * x" 可以是 _expression_ 的一部分,以及 "x == y" 等。"=" 是一个特例,所以是“=>”,因为它们不是常规运算符。 我会多练习,更仔细地看例子。 我确实希望有比计算器大但比其他示例小的示例。 也许如果我取得进展,它可以成为一个例子:)

对于我的项目,我想编写一种简单的语言来转换为 JS。 基础是外部的、词法范围的方法(没有猴子补丁,像 Dylan 或 CLOS 但没有多方法)、关键字参数、ADT,甚至可能是可选的静态类型。 “简单”只是意味着一切都可以协同工作,并且只有一种方法可以做某事。 做一些简单的事情可能是_困难的_。

此外,还有像adtmultimethods这样的库可以从原生语法中受益。 这些其实可以用sweet来实现,但是 sweet 只能扩展 JS,不能让它变得更简单。 TypeScript具有诸如“--strictNullChecks”之类的选项并支持内联联合类型,但同样,它扩展了 JS,因此它仍然保留了所有不好的东西(隐式强制、“+”用于字符串连接、范围提升等)。

再次感谢大家的帮助!
麦克风

我假设没有回溯和贪婪意味着你必须“无论你现在在哪里”工作,但事实并非如此。 好极了!

贪婪只是意味着如果它找到匹配项,它就会接受它,对吗? 但是如果整个规则不匹配,它将在下一场比赛中从头开始。 这比我最初尝试这样做要容易得多。

x, y = 2 + 3.foo + "foo", 5 * 2

当赋值可以与正则表达式等分开匹配时,这相当容易。

  = Assignment
  / Expression

Assignment
  = vars:Variables _ "=" _ expr:Expression

Variables
  = head:Identifier tail:(_ "," _ Identifier)*

...

@mikeaustin PEG 具有有序选择意味着表达式中匹配的第一个模式将自动匹配。 @langpavel的例子是表达对=>的偏爱而不是= 。 您可能想要更多地考虑表达式可以是“这些东西中的一个”,而不是“抓住所有可能是表达式的文本,然后再弄清楚”

  = FunctionExpression
  / Assignment
  / Value

为了演示,我创建了一个测试语法,您可以使用它。 这有点嘈杂,但我试图保持它非常简单,忽略了一些事情,比如允许额外的空格和运算符。 注意发生魔法的Expression块。 另外,我使用了SubExpressionExpressionList类的方法来处理“其中许多”情况; 这种模式很适合我将列表分隔符和项目分开。

在每种情况下,我都试图通过为每种匹配项设置一个项目来保持语法简单。 有一些冗余,因为我可以重写它,以便我们有一个包含所有可能组合的大匹配序列,但这很难理解和推理,并留下开放的歧义,PEG 可以通过有序选择消除这些歧义。 希望能帮助到你。

我去看看测试语法,谢谢! 由于 JavaScript 语法非常庞大,因此有助于查看语言的最小子集。

@dmsnell我最近通过删除规则并在 JavaScript 语法中添加一些新规则学到了很多,你可以在这里看到最新的: pulse.pegjs 。 我删除了省略语法 [,,]、一些运算符、序列表达式等,并添加了元组语法 (1, 2) 和范围语法 1..5。 浮点数需要两边都有小数,以使文字范围更容易解析。

我最近一直在研究很多运行时,但想回到解析器以实际发出 JavaScript。 我在工作之间,所以我有一点时间 :)一些关于清理 JavaScript 方言的

再次感谢!
麦克风

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

Coffee2CodeNL picture Coffee2CodeNL  ·  13评论

ceremcem picture ceremcem  ·  22评论

futagoza picture futagoza  ·  13评论

emmenko picture emmenko  ·  15评论

chromaticbum picture chromaticbum  ·  29评论