【发布时间】:2014-11-30 20:25:57
【问题描述】:
假设我正在创建一个仅涉及解析函数的简单 JavaScript 语言解析器。
我需要区分function "declarations"/"statements" 和function expressions。因为它们看起来几乎相同,所以我想我需要知道使用 function 的上下文。
我想我可以通过前面的记号来确定一个函数表达式。我认为以下算法可能有效:
- 如果令牌是“函数”,那么
- 如果之前的令牌是operator,
除了“关闭”运算符,如“]”、“}”或“)”,OR
如果前一个标记是“:”,那么- Function 是一个函数表达式。
- 其他
- Function 是一个函数声明。
- 如果之前的令牌是operator,
我能否期望该算法能够正确确定 function 是声明还是表达式?如果它有缺陷,应该修复什么?或者,如果不能仅通过查看前一个标记来区分形式,我还能如何以最少的努力来区分形式?
(我知道 Esprima 和 co. 存在。我想用不同的语言实现 native 解析器。)
【问题讨论】:
-
解析器是用哪种语言实现的?
-
@AndersonGreen Emacs Lisp。
-
已经用 Emacs Lisp 编写了几个解析器生成器。请参阅此处的讨论:stackoverflow.com/questions/2228477/parsing-in-emacs-lisp
-
无论我是否使用解析器生成器,我仍然需要确定我的问题中算法的准确性。
-
你在写什么样的解析器?仅检查前一个标记可能会在某些边缘情况下给出错误的结果。你不能只看周围的上下文,不管它期望一个表达式还是一个语句,来更紧密地遵循 ES5 语法?
标签: javascript parsing expression declaration abstract-syntax-tree