扫码关注官方订阅号
代码 https://github.com/jquery/esprima/blob/master/esprima.js#L4620 这种解析的手法叫做什么? 解析过程中有什么难点或者说缺点? JavaScript 是否都是用这种手法解析的?
拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
大致扫了一下好像没啥特殊的东西,基本就是普通的手写编译,大概有几个过程
输入是代码文本a = 3 + b;
a = 3 + b;
输出是一串token,比如
<ID: a> <OP: => <NumberLiteral: 3> <OP: +> <ID: b> <SYM: ;>
拿着lex输出的那串token规约为所谓的AST(抽象语法树)
比如
赋值BEGIN 左值:变量a 右值: 算数表达式BEGIN 操作符:+ 左值:常数3 右值:变量b 算数表达式END 赋值END
esprima的话应该是到此为止,如果是所谓编译器的话,接着就会把这串AST转换为目标代码了
如果你觉得上面我说的不是废话,那很可能是因为你没学过或者忘光了编译原理,那么esprima这种lex和parse同时进行而且都是纯手写的可能看起来会相当吃力。lex和parse两个独立的过程都涉及各种状态机,文法,什么什么的一堆堆的东西,混在一起如果没有相关经验的话我觉得有困难很正常,建议从编译原理看起
任何编译器解释器都逃不开这些基础的编译原理,只不过后来会有越来越(kan)牛(bu)逼(dong)的优化和演变而已。
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
大致扫了一下好像没啥特殊的东西,基本就是普通的手写编译,大概有几个过程
lex
输入是代码文本
a = 3 + b;输出是一串token,比如
parse
拿着lex输出的那串token规约为所谓的AST(抽象语法树)
比如
esprima的话应该是到此为止,如果是所谓编译器的话,接着就会把这串AST转换为目标代码了
注意点
如果你觉得上面我说的不是废话,那很可能是因为你没学过或者忘光了编译原理,那么esprima这种lex和parse同时进行而且都是纯手写的可能看起来会相当吃力。lex和parse两个独立的过程都涉及各种状态机,文法,什么什么的一堆堆的东西,混在一起如果没有相关经验的话我觉得有困难很正常,建议从编译原理看起
任何编译器解释器都逃不开这些基础的编译原理,只不过后来会有越来越(kan)牛(bu)逼(dong)的优化和演变而已。