【问题标题】:Determining left or right side of an ECMAScript assignment expression确定 ECMAScript 赋值表达式的左侧或右侧
【发布时间】:2013-04-18 01:20:06
【问题描述】:

我正在开发一个为 ECMAScript 文件的文本构建符号表的解析应用程序。我遇到的问题是在处理带有ParseTreeListener 的标识符时,确定我是在赋值运算符的右侧还是左侧。

这是使用Chris Lambrou's ANTLR grammar,它似乎与ECMAScript specification 中的官方语法非常接近。有一个名为 leftHandSideExpression 的解析器规则,但这是具有欺骗性的,因为当在 TestRig GUI 中显示时,它也会始终显示在表达式的右侧。

这是需要访问者模式的任务吗?

感谢您的建议。

【问题讨论】:

  • 当解释器模式不够用时,下一个解决方案应该是解析器。

标签: javascript parsing antlr4


【解决方案1】:

leftHandSideExpression 只能出现在以下位置:

  • assignmentOperator 的左侧。请注意,这也可以是右手边,例如x = y = 3中的表达式y
  • 后缀递增/递减运算符的表达式部分(x++x-- 中的 x)。
  • for (... in 语句的初始化部分。

要确定您当前是否在查看赋值表达式的左侧,请检查当前解析树节点及其父节点是否有 LeftHandSideExpressionContext,其父节点为 AssignmentExpressionContextAssignmentExpressionNoInContext

【讨论】:

  • 我很确定这是 leftHandSideExpression 的意图。但是,我在实践中看到的是,在一个简单的“foo = bar;”中,右侧遍历 assignmentExpression -> conditionalExpression -> logicalORExpression -> logicalANDExpression -> bitwiseORExpression -> bitwiseXORExpression -> bitwiseANDExpression -> equalExpression -> relationalExpression -> shiftExpression -> addedExpression -> multiplicativeExpression -> unaryExpression -> postfixExpression -> leftHandSideExpression。所有这一切都让我在 leftHandSideExpression 上的听众感到沮丧。
  • @TimClemons 在该链中,LeftHandSideExpressionContextparent 揭示了这种情况(请参阅我回答的最后陈述)。
  • 啊哈!这是完全有道理的。谢谢。
猜你喜欢
  • 2018-10-08
  • 2016-11-24
  • 2019-02-22
  • 2016-06-08
  • 2023-04-10
  • 1970-01-01
  • 2016-04-22
  • 2015-01-10
  • 2015-06-12
相关资源
最近更新 更多