电脑游戏中,LT是什么意思

&p&Bash 的知识点向来比较凌乱,有时候写点小脚本,你忘记了条件判断怎么写了,就打开网页搜索一半天;忘记怎么分割字符串,又搜索一半天;忘了怎么解压缩某后缀名,又打开网页搜一半天。&/p&&p&关键大部分搜出来的东西都十分琐碎,东一处,西一处,质量又参差不齐,而且看到一处有些细节有疑问,你还得接着搜索。&/p&&p&连记点笔记也是这一篇那一篇的,用起来找来找去的十分不爽,所以我一怒之下春节期间整理了一份 bash 的 cheatsheet,以图以后有关于 bash 的事情就查看这个文件就够了:&/p&&a href=&//link.zhihu.com/?target=https%3A//github.com/skywind3000/awesome-cheatsheets/blob/master/languages/bash.sh& data-draft-node=&block& data-draft-type=&link-card& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Bash Cheatsheet&/a&&p&对于一些工具性的东西,有时候一份速查表比你翻书查网页都高效数倍。&/p&
Bash 的知识点向来比较凌乱,有时候写点小脚本,你忘记了条件判断怎么写了,就打开网页搜索一半天;忘记怎么分割字符串,又搜索一半天;忘了怎么解压缩某后缀名,又打开网页搜一半天。关键大部分搜出来的东西都十分琐碎,东一处,西一处,质量又参差不齐,…
&figure&&img src=&https://pic4.zhimg.com/v2-c262cb2ce960d3c6da35e9e_b.jpg& data-rawwidth=&912& data-rawheight=&346& class=&origin_image zh-lightbox-thumb& width=&912& data-original=&https://pic4.zhimg.com/v2-c262cb2ce960d3c6da35e9e_r.jpg&&&/figure&&h2&0x00 Prologue&/h2&&p&过春节啦!祝大家新年快乐哇~有一段时间没有写文章了,前几天正好把寒假的作业写了一些,今天更一篇依旧是介绍树形数据结构的文章吧....这次看一个没有Zkw线段树那么复杂的数据结构——表达式树(Expression Tree)。&/p&&p&本篇文章将对:&/p&&ol&&li&表达式树的工作原理&/li&&li&表达式树建立步骤&/li&&li&表达式树求值&/li&&/ol&&p&进行介绍。文章代码使用JavaScript(最近某个项目需要学习,正好用一用:P),但是这个语言吧语法还是非常简单易懂的...并且我会在需要解释的地方打上注释:D。&/p&&p&另外,文章会涉及一点非常简单的词法分析器的介绍。&/p&&hr&&h2&0x01 表达式树能干啥?长啥样?&/h2&&p&Q: 给定一个合法的表达式字符串&(1+2)*(5-3)&,计算表达式的值。&/p&&p&&del&A: eval()!!(拉出去打死&/del&&/p&&p&如果使用一些没有&code&eval()&/code&的语言怎么搞?用表达式树!&/p&&p&&del&建一下,玩一年,只要998,年底清仓大甩卖,表达式树带回家&/del&&/p&&p&表达式树就是将一个表达式解析成一棵满二叉树(如果所有合法操作符都是进行二元计算),且所有非叶结点都是符号结点(&code&+-*/&/code&),叶子结点都是数字结点。对于&code&(1+2)*(5-3)&/code&我们就可以构造出一棵这样的表达式树:&/p&&figure&&img src=&https://pic2.zhimg.com/v2-9f80dce3c79e63b8bad1b_b.jpg& data-size=&normal& data-rawwidth=&1298& data-rawheight=&752& class=&origin_image zh-lightbox-thumb& width=&1298& data-original=&https://pic2.zhimg.com/v2-9f80dce3c79e63b8bad1b_r.jpg&&&figcaption&(1+2)*(5-3)的表达式树&/figcaption&&/figure&&p&可以看出来,对表达式树进行后序遍历的结果就是原表达式的逆波兰式(后缀表达式)。对表达式树进行前序遍历进行计算的结果就是我们表达式计算的结果。&/p&&hr&&h2&0x02 从字符串建立表达式树&/h2&&p&&b&0. 规定表达式组成成分&/b&&/p&&p&这里为了简化理解,就不介绍产生式了...这一部分就是规定什么能出现在将被evaluate的字符串中,定义符号集以及对应的Token。这里我们的计算器支持基础四则运算,取模以及位运算(&code&and&/code&, &code&or&/code&, &code&xor&/code&, &code&shl&/code&, &code&shr&/code&),这些符号的token我们定义为&code&OPERATOR&/code&;除了符号还有参与运算的数字, 我们将数字分为两种:&code&INTEGER&/code&和&code&DOUBLE&/code&。那么我们就可以定义一个这样的类:&/p&&div class=&highlight&&&pre&&code class=&language-js&&&span&&/span&&span class=&kr&&const&/span& &span class=&nx&&TokenType&/span& &span class=&o&&=&/span& &span class=&p&&{&/span&
&span class=&nx&&OPERATOR&/span&&span class=&o&&:&/span& &span class=&s1&&'OPERATOR'&/span&&span class=&p&&,&/span&
&span class=&nx&&INT&/span&&span class=&o&&:&/span& &span class=&s1&&'INTEGER'&/span&&span class=&p&&,&/span&
&span class=&nx&&DOUBLE&/span&&span class=&o&&:&/span& &span class=&s1&&'DECIMAL'&/span&&span class=&p&&,&/span&
&span class=&p&&}&/span&
&span class=&c1&&// 这里是可以作为关键字开头的符号表&/span&
&span class=&c1&&// 这样做为了方便之后判断Token...如果有更好的实现方法&/span&
&span class=&c1&&// 求大佬们赐教&/span&
&span class=&kr&&const&/span& &span class=&nx&&operator_list&/span& &span class=&o&&=&/span& &span class=&p&&{&/span&
&span class=&s1&&'+'&/span&&span class=&o&&:&/span& &span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&s1&&'-'&/span&&span class=&o&&:&/span& &span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&s1&&'*'&/span&&span class=&o&&:&/span& &span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&s1&&'/'&/span&&span class=&o&&:&/span& &span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&s1&&'%'&/span&&span class=&o&&:&/span& &span class=&mi&&0&/span&&span class=&p&&,&/span&
&span class=&s1&&'&'&/span&&span class=&o&&:&/span& &span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&s1&&'|'&/span&&span class=&o&&:&/span& &span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&s1&&'^'&/span&&span class=&o&&:&/span& &span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&s1&&'**'&/span&&span class=&o&&:&/span& &span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&s1&&'&'&/span&&span class=&o&&:&/span& &span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&s1&&'&'&/span&&span class=&o&&:&/span& &span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&s1&&'~'&/span&&span class=&o&&:&/span& &span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&s1&&'('&/span&&span class=&o&&:&/span& &span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&s1&&')'&/span&&span class=&o&&:&/span& &span class=&mi&&0&/span&
&span class=&p&&}&/span&
&span class=&kr&&class&/span& &span class=&nx&&Token&/span&&span class=&p&&{&/span&
&span class=&nx&&constructor&/span&&span class=&p&&(&/span&&span class=&nx&&value&/span&&span class=&p&&,&/span& &span class=&nx&&tag&/span&&span class=&p&&){&/span&
&span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&value&/span& &span class=&o&&=&/span& &span class=&nx&&value&/span&&span class=&p&&;&/span& &span class=&c1&&// 对应值&/span&
&span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&tag&/span& &span class=&o&&=&/span& &span class=&nx&&tag&/span&&span class=&p&&;&/span& &span class=&c1&&// Token类型(TokenType)&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&ol&&li&&b&词法分析&/b&&/li&&/ol&&p&为了方便建树时识别每个符号的含义,我们首先对表达式字符串进行词法分析。这个过程会将字符串中的元素拆分成一个一个的Token。例如&code&+&/code&是一个运算符,我们可以定义为&code&OPERATOR&/code&。我们将编写一个简单的词法分析器(Lexer)对表达式字符串进行词法分析。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-99a41b1f855f6d6b6b4d_b.jpg& data-size=&normal& data-rawwidth=&1684& data-rawheight=&794& class=&origin_image zh-lightbox-thumb& width=&1684& data-original=&https://pic1.zhimg.com/v2-99a41b1f855f6d6b6b4d_r.jpg&&&figcaption&Lexer的作用&/figcaption&&/figure&&p&(上图是对表达式&code&(1+2)*3.5&/code&进行词法分析后的结果。 )&/p&&p&实现一个Lexer并不难,我们只需要将字符串从左向右扫一遍,将不同类别的词素分离开即可。例如:当前位置的符号是&code&&&/code&,那么我们可以猜测这有可能是&code&shr&/code&符号;这时向后看一位,如果是&code&&&/code&那么就可以确定这是要&code&shr&/code&了 。&/p&&p&为了方便我们实现这个Lexer,首先我们写一个&code&Reader&/code&类,用于逐位读取一个可以用下标操作符的对象(用于读取输入的表达式和之后的Token列表):&/p&&div class=&highlight&&&pre&&code class=&language-js&&&span&&/span&&span class=&kr&&class&/span& &span class=&nx&&Reader&/span&&span class=&p&&{&/span& &span class=&c1&&// Reader 职阶&/span&
&span class=&nx&&constructor&/span&&span class=&p&&(&/span&&span class=&nx&&input_data&/span&&span class=&p&&){&/span&
&span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&seq&/span& &span class=&o&&=&/span& &span class=&nx&&input_data&/span&&span class=&p&&;&/span&
&span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&cursor&/span& &span class=&o&&=&/span& &span class=&mi&&0&/span&&span class=&p&&;&/span&
&span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&urng&/span& &span class=&o&&=&/span& &span class=&nx&&input_data&/span&&span class=&p&&.&/span&&span class=&nx&&length&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&nx&&next&/span&&span class=&p&&()&/span& &span class=&p&&{&/span&
&span class=&k&&return&/span& &span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&seq&/span&&span class=&p&&[&/span&&span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&cursor&/span&&span class=&o&&++&/span&&span class=&p&&];&/span& &span class=&c1&&// 返回当前位置的字符并将游标向后移动1&/span&
&span class=&p&&}&/span&
&span class=&nx&&cursor_data&/span&&span class=&p&&()&/span& &span class=&p&&{&/span&
&span class=&k&&return&/span& &span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&seq&/span&&span class=&p&&[&/span&&span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&cursor&/span&&span class=&p&&]&/span& &span class=&c1&&// 返回当前游标所指的数据&/span&
&span class=&p&&}&/span&
&span class=&nx&&has_next&/span&&span class=&p&&()&/span& &span class=&p&&{&/span&
&span class=&k&&return&/span& &span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&cursor&/span& &span class=&o&&&&/span& &span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&urng&/span&&span class=&p&&;&/span& &span class=&c1&&// 调用next()是否还有数据&/span&
&span class=&p&&}&/span&
&span class=&nx&&peek&/span&&span class=&p&&()&/span& &span class=&p&&{&/span&
&span class=&k&&return&/span& &span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&seq&/span&&span class=&p&&[&/span&&span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&cursor&/span& &span class=&o&&+&/span& &span class=&mi&&1&/span&&span class=&p&&];&/span& &span class=&c1&&// 向后看一位&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&p&写好&code&Reader&/code&类之后,我们再实现Lexer:&/p&&div class=&highlight&&&pre&&code class=&language-js&&&span&&/span&&span class=&kd&&var&/span& &span class=&nx&&reader&/span&&span class=&p&&;&/span&
&span class=&kr&&class&/span& &span class=&nx&&Lexer&/span&&span class=&p&&{&/span& &span class=&c1&&// Lexer 职阶&/span&
&span class=&nx&&constructor&/span&&span class=&p&&(&/span&&span class=&nx&&input_expreesion&/span&&span class=&p&&){&/span&
&span class=&nx&&reader&/span& &span class=&o&&=&/span& &span class=&k&&new&/span& &span class=&nx&&Reader&/span&&span class=&p&&(&/span&&span class=&nx&&input_expreesion&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&
&span class=&nx&&parse&/span&&span class=&p&&(){&/span&
&span class=&kd&&var&/span& &span class=&nx&&token_list&/span& &span class=&o&&=&/span& &span class=&p&&[];&/span& &span class=&c1&&// 保存解析出的Token,Token列表&/span&
&span class=&kd&&let&/span& &span class=&nx&&last_token&/span& &span class=&o&&=&/span& &span class=&p&&()&/span& &span class=&o&&=&&/span& &span class=&p&&{&/span&&span class=&k&&return&/span& &span class=&nx&&token_list&/span&&span class=&p&&[&/span&&span class=&nx&&token_list&/span&&span class=&p&&.&/span&&span class=&nx&&length&/span& &span class=&o&&-&/span& &span class=&mi&&1&/span&&span class=&p&&]};&/span& &span class=&c1&&// 返回上一个解析的Token&/span&
&span class=&kd&&let&/span& &span class=&nx&&is_digit&/span& &span class=&o&&=&/span& &span class=&p&&(&/span&&span class=&nx&&x&/span&&span class=&p&&)&/span& &span class=&o&&=&&/span& &span class=&p&&{&/span&&span class=&k&&return&/span& &span class=&nx&&x&/span& &span class=&o&&&=&/span& &span class=&s1&&'0'&/span& &span class=&o&&&&&/span& &span class=&nx&&x&/span& &span class=&o&&&=&/span& &span class=&s1&&'9'&/span&&span class=&p&&};&/span&
&span class=&kd&&let&/span& &span class=&nx&&is_escape&/span& &span class=&o&&=&/span& &span class=&p&&(&/span&&span class=&nx&&x&/span&&span class=&p&&)&/span& &span class=&o&&=&&/span& &span class=&p&&{&/span&&span class=&k&&return&/span& &span class=&nx&&x&/span& &span class=&o&&===&/span& &span class=&s1&&' '&/span& &span class=&o&&||&/span& &span class=&nx&&x&/span& &span class=&o&&===&/span& &span class=&s1&&'\n'&/span& &span class=&o&&||&/span& &span class=&nx&&x&/span& &span class=&o&&===&/span& &span class=&s1&&'\t'&/span&&span class=&p&&};&/span&
&span class=&kd&&function&/span& &span class=&nx&&readNum&/span&&span class=&p&&()&/span& &span class=&p&&{&/span&
&span class=&kd&&var&/span& &span class=&nx&&ans&/span& &span class=&o&&=&/span& &span class=&p&&{&/span&
&span class=&nx&&v&/span&&span class=&o&&:&/span& &span class=&s1&&''&/span&&span class=&p&&,&/span& &span class=&nx&&t&/span&&span class=&o&&:&/span& &span class=&nx&&TokenType&/span&&span class=&p&&.&/span&&span class=&nx&&INT&/span&
&span class=&p&&};&/span&
&span class=&c1&&// 读取剩余的数字或小数点&/span&
&span class=&k&&while&/span&&span class=&p&&(&/span&&span class=&nx&&reader&/span&&span class=&p&&.&/span&&span class=&nx&&has_next&/span&&span class=&p&&()&/span& &span class=&o&&&&&/span& &span class=&p&&(&/span&&span class=&nx&&is_digit&/span&&span class=&p&&(&/span&&span class=&nx&&reader&/span&&span class=&p&&.&/span&&span class=&nx&&cursor_data&/span&&span class=&p&&())&/span& &span class=&o&&||&/span& &span class=&nx&&reader&/span&&span class=&p&&.&/span&&span class=&nx&&cursor_data&/span&&span class=&p&&()&/span& &span class=&o&&===&/span& &span class=&s1&&'.'&/span& &span class=&o&&||&/span& &span class=&nx&&is_escape&/span&&span class=&p&&(&/span&&span class=&nx&&reader&/span&&span class=&p&&.&/span&&span class=&nx&&cursor_data&/span&&span class=&p&&()))){&/span&
&span class=&k&&if&/span&&span class=&p&&(&/span&&span class=&nx&&is_escape&/span&&span class=&p&&(&/span&&span class=&nx&&reader&/span&&span class=&p&&.&/span&&span class=&nx&&cursor_data&/span&&span class=&p&&()))&/span& &span class=&p&&{&/span&
&span class=&c1&&// 感谢@被子飞了提醒...这里需要把cursor向后移动一位&/span&
&span class=&nx&&reader&/span&&span class=&p&&.&/span&&span class=&nx&&next&/span&&span class=&p&&();&/span&
&span class=&k&&continue&/span&&span class=&p&&;&/span&
&span class=&p&&};&/span&
&span class=&nx&&ans&/span&&span class=&p&&.&/span&&span class=&nx&&v&/span& &span class=&o&&+=&/span& &span class=&nx&&reader&/span&&span class=&p&&.&/span&&span class=&nx&&next&/span&&span class=&p&&();&/span&
&span class=&p&&}&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&nx&&reader&/span&&span class=&p&&.&/span&&span class=&nx&&has_next&/span&&span class=&p&&()&/span& &span class=&o&&&&&/span& &span class=&nx&&reader&/span&&span class=&p&&.&/span&&span class=&nx&&cursor_data&/span&&span class=&p&&()&/span& &span class=&o&&===&/span& &span class=&s1&&'e'&/span& &span class=&o&&&&&/span& &span class=&p&&(&/span&&span class=&nx&&reader&/span&&span class=&p&&.&/span&&span class=&nx&&peek&/span&&span class=&p&&()&/span& &span class=&o&&===&/span& &span class=&s1&&'-'&/span& &span class=&o&&||&/span& &span class=&nx&&reader&/span&&span class=&p&&.&/span&&span class=&nx&&peek&/span&&span class=&p&&()&/span& &span class=&o&&===&/span& &span class=&s1&&'+'&/span&&span class=&p&&)){&/span&
&span class=&nx&&ans&/span&&span class=&p&&.&/span&&span class=&nx&&v&/span& &span class=&o&&+=&/span& &span class=&nx&&reader&/span&&span class=&p&&.&/span&&span class=&nx&&next&/span&&span class=&p&&()&/span& &span class=&o&&+&/span& &span class=&nx&&reader&/span&&span class=&p&&.&/span&&span class=&nx&&next&/span&&span class=&p&&();&/span&
&span class=&k&&while&/span&&span class=&p&&(&/span&&span class=&nx&&reader&/span&&span class=&p&&.&/span&&span class=&nx&&has_next&/span&&span class=&p&&()&/span& &span class=&o&&&&&/span& &span class=&nx&&is_digit&/span&&span class=&p&&(&/span&&span class=&nx&&reader&/span&&span class=&p&&.&/span&&span class=&nx&&cursor_data&/span&&span class=&p&&())){&/span&
&span class=&nx&&ans&/span&&span class=&p&&.&/span&&span class=&nx&&v&/span& &span class=&o&&+=&/span& &span class=&nx&&reader&/span&&span class=&p&&.&/span&&span class=&nx&&next&/span&&span class=&p&&();&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span& &span class=&c1&&// 科学计数&/span&
&span class=&k&&if&/span&&span class=&p&&(&/span&&span class=&nx&&ans&/span&&span class=&p&&.&/span&&span class=&nx&&v&/span&&span class=&p&&.&/span&&span class=&nx&&search&/span&&span class=&p&&(&/span&&span class=&s1&&'.'&/span&&span class=&p&&)&/span& &span class=&o&&!==&/span& &span class=&o&&-&/span&&span class=&mi&&1&/span& &span class=&o&&||&/span& &span class=&nx&&ans&/span&&span class=&p&&.&/span&&span class=&nx&&v&/span&&span class=&p&&.&/span&&span class=&nx&&search&/span&&span class=&p&&(&/span&&span class=&s1&&'e-'&/span&&span class=&p&&)&/span& &span class=&o&&!==&/span& &span class=&o&&-&/span&&span class=&mi&&1&/span&&span class=&p&&){&/span&
&span class=&nx&&ans&/span&&span class=&p&&.&/span&&span class=&nx&&t&/span& &span class=&o&&=&/span& &span class=&nx&&TokenType&/span&&span class=&p&&.&/span&&span class=&nx&&DOUBLE&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&k&&return&/span& &span class=&nx&&ans&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&k&&while&/span& &span class=&p&&(&/span&&span class=&nx&&reader&/span&&span class=&p&&.&/span&&span class=&nx&&has_next&/span&&span class=&p&&()){&/span&
&span class=&kd&&var&/span& &span class=&nx&&cur&/span& &span class=&o&&=&/span& &span class=&nx&&reader&/span&&span class=&p&&.&/span&&span class=&nx&&next&/span&&span class=&p&&();&/span&
&span class=&k&&if&/span&&span class=&p&&(&/span&&span class=&nx&&is_escape&/span&&span class=&p&&(&/span&&span class=&nx&&cur&/span&&span class=&p&&))&/span& &span class=&k&&continue&/span&&span class=&p&&;&/span&
&span class=&k&&if&/span&&span class=&p&&(&/span&&span class=&nx&&is_digit&/span&&span class=&p&&(&/span&&span class=&nx&&cur&/span&&span class=&p&&))&/span& &span class=&p&&{&/span&
&span class=&kd&&var&/span& &span class=&nx&&ret&/span& &span class=&o&&=&/span& &span class=&nx&&readNum&/span&&span class=&p&&();&/span&
&span class=&nx&&token_list&/span&&span class=&p&&.&/span&&span class=&nx&&push&/span&&span class=&p&&(&/span&&span class=&k&&new&/span& &span class=&nx&&Token&/span&&span class=&p&&(&/span&&span class=&nx&&cur&/span& &span class=&o&&+&/span& &span class=&nx&&ret&/span&&span class=&p&&.&/span&&span class=&nx&&v&/span&&span class=&p&&,&/span& &span class=&nx&&ret&/span&&span class=&p&&.&/span&&span class=&nx&&t&/span&&span class=&p&&));&/span&
&span class=&p&&}&/span&&span class=&k&&else&/span& &span class=&k&&if&/span&&span class=&p&&(&/span&&span class=&nx&&cur&/span& &span class=&k&&in&/span& &span class=&nx&&operator_list&/span&&span class=&p&&){&/span&
&span class=&kd&&var&/span& &span class=&nx&&prev&/span& &span class=&o&&=&/span& &span class=&nx&&last_token&/span&&span class=&p&&();&/span&
&span class=&k&&if&/span&&span class=&p&&(&/span&&span class=&k&&typeof&/span& &span class=&nx&&prev&/span& &span class=&o&&!==&/span& &span class=&s1&&'undefined'&/span&&span class=&p&&)&/span& &span class=&nx&&prev&/span& &span class=&o&&=&/span& &span class=&nx&&prev&/span&&span class=&p&&.&/span&&span class=&nx&&tag&/span&&span class=&p&&;&/span&
&span class=&k&&if&/span&&span class=&p&&(&/span&&span class=&nx&&cur&/span& &span class=&o&&===&/span& &span class=&s1&&'-'&/span&&span class=&p&&){&/span& &span class=&c1&&// 分两种情况,1. 负数 2. 减法&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&k&&typeof&/span& &span class=&nx&&prev&/span& &span class=&o&&!==&/span& &span class=&s1&&'undefined'&/span& &span class=&o&&&&&/span& &span class=&p&&(&/span&&span class=&nx&&prev&/span& &span class=&o&&===&/span& &span class=&nx&&TokenType&/span&&span class=&p&&.&/span&&span class=&nx&&INT&/span& &span class=&o&&||&/span& &span class=&nx&&prev&/span& &span class=&o&&===&/span& &span class=&nx&&TokenType&/span&&span class=&p&&.&/span&&span class=&nx&&DOUBLE&/span&&span class=&p&&)){&/span&
&span class=&nx&&token_list&/span&&span class=&p&&.&/span&&span class=&nx&&push&/span&&span class=&p&&(&/span&&span class=&k&&new&/span& &span class=&nx&&Token&/span&&span class=&p&&(&/span&&span class=&nx&&cur&/span&&span class=&p&&,&/span& &span class=&nx&&TokenType&/span&&span class=&p&&.&/span&&span class=&nx&&OPERATOR&/span&&span class=&p&&));&/span& &span class=&c1&&// 作为运算符处理&/span&
&span class=&p&&}&/span&&span class=&k&&else&/span&&span class=&p&&{&/span&
&span class=&kd&&var&/span& &span class=&nx&&ret&/span& &span class=&o&&=&/span& &span class=&nx&&readNum&/span&&span class=&p&&();&/span&
&span class=&nx&&cur&/span& &span class=&o&&+=&/span& &span class=&nx&&ret&/span&&span class=&p&&.&/span&&span class=&nx&&v&/span&&span class=&p&&;&/span&
&span class=&nx&&token_list&/span&&span class=&p&&.&/span&&span class=&nx&&push&/span&&span class=&p&&(&/span&&span class=&k&&new&/span& &span class=&nx&&Token&/span&&span class=&p&&(&/span&&span class=&nx&&cur&/span&&span class=&p&&,&/span& &span class=&nx&&ret&/span&&span class=&p&&.&/span&&span class=&nx&&t&/span&&span class=&p&&));&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span&&span class=&k&&else&/span& &span class=&k&&if&/span&&span class=&p&&(&/span&&span class=&nx&&cur&/span& &span class=&o&&===&/span& &span class=&s1&&'~'&/span&&span class=&p&&){&/span&
&span class=&kd&&var&/span& &span class=&nx&&ret&/span& &span class=&o&&=&/span& &span class=&nx&&readNum&/span&&span class=&p&&();&/span&
&span class=&nx&&token_list&/span&&span class=&p&&.&/span&&span class=&nx&&push&/span&&span class=&p&&(&/span&&span class=&k&&new&/span& &span class=&nx&&Token&/span&&span class=&p&&(&/span&&span class=&nx&&cur&/span& &span class=&o&&+&/span& &span class=&nx&&ret&/span&&span class=&p&&.&/span&&span class=&nx&&v&/span&&span class=&p&&,&/span& &span class=&nx&&TokenType&/span&&span class=&p&&.&/span&&span class=&nx&&INT&/span&&span class=&p&&));&/span&
&span class=&p&&}&/span&&span class=&k&&else&/span& &span class=&k&&if&/span&&span class=&p&&((&/span&&span class=&nx&&cur&/span& &span class=&o&&===&/span& &span class=&s1&&'*'&/span& &span class=&o&&||&/span& &span class=&nx&&cur&/span& &span class=&o&&===&/span& &span class=&s1&&'&'&/span& &span class=&o&&||&/span& &span class=&nx&&cur&/span& &span class=&o&&===&/span& &span class=&s1&&'&'&/span&&span class=&p&&)&/span& &span class=&o&&&&&/span& &span class=&nx&&reader&/span&&span class=&p&&.&/span&&span class=&nx&&has_next&/span&&span class=&p&&()&/span& &span class=&o&&&&&/span& &span class=&nx&&reader&/span&&span class=&p&&.&/span&&span class=&nx&&cursor_data&/span&&span class=&p&&()&/span& &span class=&o&&===&/span& &span class=&nx&&cur&/span&&span class=&p&&){&/span&
&span class=&nx&&cur&/span& &span class=&o&&+=&/span& &span class=&nx&&reader&/span&&span class=&p&&.&/span&&span class=&nx&&next&/span&&span class=&p&&()&/span& &span class=&c1&&// 当前位置和上一个位置是同一个Operator,两个组合成指定Operator(** && &&)&/span&
&span class=&nx&&token_list&/span&&span class=&p&&.&/span&&span class=&nx&&push&/span&&span class=&p&&(&/span&&span class=&k&&new&/span& &span class=&nx&&Token&/span&&span class=&p&&(&/span&&span class=&nx&&cur&/span&&span class=&p&&,&/span& &span class=&nx&&TokenType&/span&&span class=&p&&.&/span&&span class=&nx&&OPERATOR&/span&&span class=&p&&));&/span&
&span class=&p&&}&/span&&span class=&k&&else&/span&&span class=&p&&{&/span&
&span class=&nx&&token_list&/span&&span class=&p&&.&/span&&span class=&nx&&push&/span&&span class=&p&&(&/span&&span class=&k&&new&/span& &span class=&nx&&Token&/span&&span class=&p&&(&/span&&span class=&nx&&cur&/span&&span class=&p&&,&/span& &span class=&nx&&TokenType&/span&&span class=&p&&.&/span&&span class=&nx&&OPERATOR&/span&&span class=&p&&));&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span&&span class=&k&&else&/span&&span class=&p&&{&/span&
&span class=&k&&throw&/span& &span class=&s2&&&Error character @ &&/span& &span class=&o&&+&/span& &span class=&p&&(&/span&&span class=&nx&&reader&/span&&span class=&p&&.&/span&&span class=&nx&&cursor&/span& &span class=&o&&-&/span& &span class=&mi&&1&/span&&span class=&p&&)&/span& &span class=&o&&+&/span& &span class=&s2&&& &&/span& &span class=&o&&+&/span& &span class=&nx&&cur&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span&
&span class=&k&&return&/span& &span class=&nx&&token_list&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&p&至此,一个简单的Lexer就编写完毕了。可以通过&code&console.log(new Lexer(&(1+2)*3&))&/code&看看解析是否正确。&/p&&p&e.g: &code&(1.25+3e-2+1e+3)*5&/code&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-b704ff1ea791913ebe35d4073bdd8bef_b.jpg& data-size=&normal& data-rawwidth=&962& data-rawheight=&414& class=&origin_image zh-lightbox-thumb& width=&962& data-original=&https://pic2.zhimg.com/v2-b704ff1ea791913ebe35d4073bdd8bef_r.jpg&&&figcaption&Tokenize: (1.25+3e-2+1e+3)*5&/figcaption&&/figure&&hr&&h2&0x03 通过Token列表建立表达式树 & 求值&/h2&&p&这时我们的&code&Reader&/code&又派上用场了&del&(上吧!Reader,ATK +450↑)&/del&。我们建立表达式树的时候也需要从左向右扫一遍我们的Token们。我们需要两个栈(Stack)存储两类数据:&/p&&ul&&li&Number Stack
(数字栈)&/li&&li&Operator Stack
(符号栈)&/li&&/ul&&p&事实上,这里的数字栈并不只存数字,而是存&b&可被求值的结点&/b&。&/p&&p&为了方便之后的求值,我们定义两种表达式树节点:&/p&&ul&&li&常数结点&/li&&li&操作符结点&/li&&/ul&&p&其中常数结点存储一个单独的值&code&value&/code&和一个求值方法&code&eval()&/code&(直接返回&code&value&/code&);操作符结点分为&code&op&/code&,&code&fi&/code&,和&code&se&/code&,分别是操作符,左表达式,右表达式。注意左右表达式既可以是操作符结点也可以是常数结点。操作符结点也有一个求值方法&code&eval()&/code&,判断&code&op&/code&并返回相应值:&/p&&p&&b&常数结点:&/b&&/p&&div class=&highlight&&&pre&&code class=&language-js&&&span&&/span&&span class=&kr&&class&/span& &span class=&nx&&ConstNode&/span&&span class=&p&&{&/span&
&span class=&nx&&constructor&/span&&span class=&p&&(&/span&&span class=&nx&&v&/span&&span class=&p&&){&/span&
&span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&value&/span& &span class=&o&&=&/span& &span class=&nx&&v&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&nb&&eval&/span&&span class=&p&&(){&/span&
&span class=&k&&return&/span& &span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&value&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&p&&b&操作符结点:&/b&&/p&&div class=&highlight&&&pre&&code class=&language-js&&&span&&/span&&span class=&kr&&class&/span& &span class=&nx&&OperatorNode&/span&&span class=&p&&{&/span&
&span class=&nx&&constructor&/span&&span class=&p&&(&/span&&span class=&nx&&op&/span&&span class=&p&&,&/span& &span class=&nx&&fi&/span&&span class=&p&&,&/span& &span class=&nx&&se&/span&&span class=&p&&){&/span&
&span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&op&/span& &span class=&o&&=&/span& &span class=&nx&&op&/span&&span class=&p&&;&/span&
&span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&fi&/span& &span class=&o&&=&/span& &span class=&nx&&fi&/span&&span class=&p&&;&/span&
&span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&se&/span& &span class=&o&&=&/span& &span class=&nx&&se&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&nb&&eval&/span&&span class=&p&&(){&/span&
&span class=&k&&switch&/span&&span class=&p&&(&/span&&span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&op&/span&&span class=&p&&){&/span&
&span class=&k&&case&/span& &span class=&s1&&'+'&/span&&span class=&o&&:&/span&
&span class=&k&&return&/span& &span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&fi&/span&&span class=&p&&.&/span&&span class=&nb&&eval&/span&&span class=&p&&()&/span& &span class=&o&&+&/span& &span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&se&/span&&span class=&p&&.&/span&&span class=&nb&&eval&/span&&span class=&p&&();&/span&
&span class=&k&&case&/span& &span class=&s1&&'-'&/span&&span class=&o&&:&/span&
&span class=&k&&return&/span& &span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&fi&/span&&span class=&p&&.&/span&&span class=&nb&&eval&/span&&span class=&p&&()&/span& &span class=&o&&-&/span& &span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&se&/span&&span class=&p&&.&/span&&span class=&nb&&eval&/span&&span class=&p&&();&/span&
&span class=&k&&case&/span& &span class=&s1&&'*'&/span&&span class=&o&&:&/span&
&span class=&k&&return&/span& &span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&fi&/span&&span class=&p&&.&/span&&span class=&nb&&eval&/span&&span class=&p&&()&/span& &span class=&o&&*&/span& &span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&se&/span&&span class=&p&&.&/span&&span class=&nb&&eval&/span&&span class=&p&&();&/span&
&span class=&k&&case&/span& &span class=&s1&&'/'&/span&&span class=&o&&:&/span&
&span class=&k&&return&/span& &span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&fi&/span&&span class=&p&&.&/span&&span class=&nb&&eval&/span&&span class=&p&&()&/span& &span class=&o&&/&/span& &span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&se&/span&&span class=&p&&.&/span&&span class=&nb&&eval&/span&&span class=&p&&();&/span&
&span class=&k&&case&/span& &span class=&s1&&'%'&/span&&span class=&o&&:&/span&
&span class=&k&&return&/span& &span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&fi&/span&&span class=&p&&.&/span&&span class=&nb&&eval&/span&&span class=&p&&()&/span& &span class=&o&&%&/span& &span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&se&/span&&span class=&p&&.&/span&&span class=&nb&&eval&/span&&span class=&p&&();&/span&
&span class=&k&&case&/span& &span class=&s1&&'**'&/span&&span class=&o&&:&/span&
&span class=&k&&return&/span& &span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&fi&/span&&span class=&p&&.&/span&&span class=&nb&&eval&/span&&span class=&p&&()&/span& &span class=&o&&**&/span& &span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&se&/span&&span class=&p&&.&/span&&span class=&nb&&eval&/span&&span class=&p&&();&/span&
&span class=&k&&case&/span& &span class=&s1&&'&&'&/span&&span class=&o&&:&/span&
&span class=&k&&return&/span& &span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&fi&/span&&span class=&p&&.&/span&&span class=&nb&&eval&/span&&span class=&p&&()&/span& &span class=&o&&&&&/span& &span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&se&/span&&span class=&p&&.&/span&&span class=&nb&&eval&/span&&span class=&p&&();&/span&
&span class=&k&&case&/span& &span class=&s1&&'&&'&/span&&span class=&o&&:&/span&
&span class=&k&&return&/span& &span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&fi&/span&&span class=&p&&.&/span&&span class=&nb&&eval&/span&&span class=&p&&()&/span& &span class=&o&&&&&/span& &span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&se&/span&&span class=&p&&.&/span&&span class=&nb&&eval&/span&&span class=&p&&();&/span&
&span class=&k&&case&/span& &span class=&s1&&'&'&/span&&span class=&o&&:&/span&
&span class=&k&&return&/span& &span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&fi&/span&&span class=&p&&.&/span&&span class=&nb&&eval&/span&&span class=&p&&()&/span& &span class=&o&&&&/span& &span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&se&/span&&span class=&p&&.&/span&&span class=&nb&&eval&/span&&span class=&p&&();&/span&
&span class=&k&&case&/span& &span class=&s1&&'|'&/span&&span class=&o&&:&/span&
&span class=&k&&return&/span& &span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&fi&/span&&span class=&p&&.&/span&&span class=&nb&&eval&/span&&span class=&p&&()&/span& &span class=&o&&|&/span& &span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&se&/span&&span class=&p&&.&/span&&span class=&nb&&eval&/span&&span class=&p&&();&/span&
&span class=&k&&case&/span& &span class=&s1&&'^'&/span&&span class=&o&&:&/span&
&span class=&k&&return&/span& &span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&fi&/span&&span class=&p&&.&/span&&span class=&nb&&eval&/span&&span class=&p&&()&/span& &span class=&o&&^&/span& &span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&se&/span&&span class=&p&&.&/span&&span class=&nb&&eval&/span&&span class=&p&&();&/span&
&span class=&k&&default&/span&&span class=&o&&:&/span&
&span class=&k&&break&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&p&(Tips: 这里使两种结点求值方法名相同就是为了方便整棵树的求值)&/p&&p&我们定义一个&code&addNode()&/code&函数,这个函数会从数字栈中取出栈顶的两个元素,然后再从符号栈中取出栈顶符号,最后将刚刚取出的符号和两个表达式元素放入一个符号结点,加入到数字栈当中作为一个新的“数字”(可被求值对象)。&/p&&p&当从左向右扫描的时候如果遇到的Token是INTEGER或者DOUBLE,我们就直接将其处理一下(&code&parseInt()&/code&或&code&parseFloat()&/code&)放入数字栈中;如果遇到的是OPERATOR,我们按照运算优先级进行操作。这里不需要明确写出运算优先级,我们只需要一直执行&code&addNode()&/code&直到遇到了比当前运算符优先级低的符号为止(比如遇到了&code&*&/code&和&code&/&/code&,那么我们就一直执行&code&addNode()&/code&直到遇到&code&+, -, &, |, ^&/code&),最后再把当前运算符放入符号栈。&/p&&div class=&highlight&&&pre&&code class=&language-js&&&span&&/span&&span class=&kr&&class&/span& &span class=&nx&&ExpressionTreeConstructor&/span&&span class=&p&&{&/span&
&span class=&nx&&constructor&/span&&span class=&p&&(&/span&&span class=&nx&&tokenList&/span&&span class=&p&&){&/span&
&span class=&nx&&reader&/span& &span class=&o&&=&/span& &span class=&k&&new&/span& &span class=&nx&&Reader&/span&&span class=&p&&(&/span&&span class=&nx&&tokenList&/span&&span class=&p&&);&/span&
&span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&operator&/span& &span class=&o&&=&/span& &span class=&p&&[];&/span& &span class=&c1&&// 符号栈&/span&
&span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&num&/span& &span class=&o&&=&/span& &span class=&p&&[];&/span& &span class=&c1&&// 数字栈&/span&
&span class=&p&&}&/span&
&span class=&nx&&addNode&/span&&span class=&p&&(){&/span&
&span class=&kd&&var&/span& &span class=&nx&&se&/span& &span class=&o&&=&/span& &span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&num&/span&&span class=&p&&.&/span&&span class=&nx&&pop&/span&&span class=&p&&();&/span& &span class=&c1&&// LIFO, 第二个在前面&/span&
&span class=&kd&&var&/span& &span class=&nx&&fi&/span& &span class=&o&&=&/span& &span class=&k&&new&/span& &span class=&nx&&ConstNode&/span&&span class=&p&&(&/span&&span class=&mi&&0&/span&&span class=&p&&);&/span&
&span class=&k&&if&/span&&span class=&p&&(&/span&&span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&num&/span&&span class=&p&&.&/span&&span class=&nx&&length&/span& &span class=&o&&!==&/span& &span class=&mi&&0&/span&&span class=&p&&){&/span&
&span class=&nx&&fi&/span& &span class=&o&&=&/span& &span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&num&/span&&span class=&p&&.&/span&&span class=&nx&&pop&/span&&span class=&p&&();&/span&
&span class=&p&&}&/span&
&span class=&kd&&var&/span& &span class=&nx&&op&/span& &span class=&o&&=&/span& &span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&operator&/span&&span class=&p&&.&/span&&span class=&nx&&pop&/span&&span class=&p&&();&/span& &span class=&c1&&// 取出栈顶符号&/span&
&span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&num&/span&&span class=&p&&.&/span&&span class=&nx&&push&/span&&span class=&p&&(&/span&&span class=&k&&new&/span& &span class=&nx&&OperatorNode&/span&&span class=&p&&(&/span&&span class=&nx&&op&/span&&span class=&p&&,&/span& &span class=&nx&&fi&/span&&span class=&p&&,&/span& &span class=&nx&&se&/span&&span class=&p&&));&/span& &span class=&c1&&// 将三个元素打包成符号结点放入数字栈中&/span&
&span class=&p&&}&/span&
&span class=&nx&&get&/span& &span class=&nx&&opTop&/span&&span class=&p&&(){&/span&
&span class=&k&&return&/span& &span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&operator&/span&&span class=&p&&[&/span&&span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&operator&/span&&span class=&p&&.&/span&&span class=&nx&&length&/span& &span class=&o&&-&/span& &span class=&mi&&1&/span&&span class=&p&&]&/span&
&span class=&p&&}&/span&
&span class=&nx&&build_tree&/span&&span class=&p&&(){&/span&
&span class=&k&&while&/span&&span class=&p&&(&/span&&span class=&nx&&reader&/span&&span class=&p&&.&/span&&span class=&nx&&has_next&/span&&span class=&p&&()){&/span&
&span class=&kd&&var&/span& &span class=&nx&&cur&/span& &span class=&o&&=&/span& &span class=&nx&&reader&/span&&span class=&p&&.&/span&&span class=&nx&&next&/span&&span class=&p&&();&/span&
&span class=&nx&&console&/span&&span class=&p&&.&/span&&span class=&nx&&log&/span&&span class=&p&&(&/span&&span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&num&/span&&span class=&p&&,&/span& &span class=&nx&&cur&/span&&span class=&p&&.&/span&&span class=&nx&&value&/span&&span class=&p&&);&/span&
&span class=&k&&switch&/span& &span class=&p&&(&/span&&span class=&nx&&cur&/span&&span class=&p&&.&/span&&span class=&nx&&tag&/span&&span class=&p&&)&/span& &span class=&p&&{&/span&
&span class=&k&&case&/span& &span class=&nx&&TokenType&/span&&span class=&p&&.&/span&&span class=&nx&&INT&/span&&span class=&o&&:&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&nx&&cur&/span&&span class=&p&&.&/span&&span class=&nx&&value&/span&&span class=&p&&.&/span&&span class=&nx&&startsWith&/span&&span class=&p&&(&/span&&span class=&s1&&'~'&/span&&span class=&p&&))&/span& &span class=&p&&{&/span&
&span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&num&/span&&span class=&p&&.&/span&&span class=&nx&&push&/span&&span class=&p&&(&/span&&span class=&k&&new&/span& &span class=&nx&&ConstNode&/span&&span class=&p&&(&/span&&span class=&o&&~&/span&&span class=&nb&&parseInt&/span&&span class=&p&&(&/span&&span class=&nx&&cur&/span&&span class=&p&&.&/span&&span class=&nx&&value&/span&&span class=&p&&.&/span&&span class=&nx&&slice&/span&&span class=&p&&(&/span&&span class=&mi&&1&/span&&span class=&p&&))));&/span&
&span class=&p&&}&/span& &span class=&k&&else&/span& &span class=&p&&{&/span&
&span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&num&/span&&span class=&p&&.&/span&&span class=&nx&&push&/span&&span class=&p&&(&/span&&span class=&k&&new&/span& &span class=&nx&&ConstNode&/span&&span class=&p&&(&/span&&span class=&nb&&parseInt&/span&&span class=&p&&(&/span&&span class=&nx&&cur&/span&&span class=&p&&.&/span&&span class=&nx&&value&/span&&span class=&p&&)));&/span&
&span class=&p&&}&/span&
&span class=&k&&break&/span&&span class=&p&&;&/span&
&span class=&k&&case&/span& &span class=&nx&&TokenType&/span&&span class=&p&&.&/span&&span class=&nx&&DOUBLE&/span&&span class=&o&&:&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&nx&&cur&/span&&span class=&p&&.&/span&&span class=&nx&&value&/span&&span class=&p&&.&/span&&span class=&nx&&startsWith&/span&&span class=&p&&(&/span&&span class=&s1&&'~'&/span&&span class=&p&&))&/span& &span class=&p&&{&/span& &span class=&c1&&// 这个应该没啥意义...&/span&
&span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&num&/span&&span class=&p&&.&/span&&span class=&nx&&push&/span&&span class=&p&&(&/span&&span class=&k&&new&/span& &span class=&nx&&ConstNode&/span&&span class=&p&&(&/span&&span class=&o&&~&/span&&span class=&nb&&parseFloat&/span&&span class=&p&&(&/span&&span class=&nx&&cur&/span&&span class=&p&&.&/span&&span class=&nx&&value&/span&&span class=&p&&.&/span&&span class=&nx&&slice&/span&&span class=&p&&(&/span&&span class=&mi&&1&/span&&span class=&p&&))));&/span&
&span class=&p&&}&/span& &span class=&k&&else&/span& &span class=&p&&{&/span&
&span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&num&/span&&span class=&p&&.&/span&&span class=&nx&&push&/span&&span class=&p&&(&/span&&span class=&k&&new&/span& &span class=&nx&&ConstNode&/span&&span class=&p&&(&/span&&span class=&nb&&parseFloat&/span&&span class=&p&&(&/span&&span class=&nx&&cur&/span&&span class=&p&&.&/span&&span class=&nx&&value&/span&&span class=&p&&)));&/span&
&span class=&p&&}&/span&
&span class=&k&&break&/span&&span class=&p&&;&/span&
&span class=&k&&case&/span& &span class=&nx&&TokenType&/span&&span class=&p&&.&/span&&span class=&nx&&OPERATOR&/span&&span class=&o&&:&/span&
&span class=&k&&switch&/span&&span class=&p&&(&/span&&span class=&nx&&cur&/span&&span class=&p&&.&/span&&span class=&nx&&value&/span&&span class=&p&&){&/span&
&span class=&k&&case&/span& &span class=&s1&&'('&/span&&span class=&o&&:&/span&
&span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&operator&/span&&span class=&p&&.&/span&&span class=&nx&&push&/span&&span class=&p&&(&/span&&span class=&s1&&'('&/span&&span class=&p&&);&/span& &span class=&c1&&// 这个符号优先级最低,直接加入符号栈&/span&
&span class=&k&&break&/span&&span class=&p&&;&/span&
&span class=&k&&case&/span& &span class=&s1&&')'&/span&&span class=&o&&:&/span&
&span class=&k&&while&/span&&span class=&p&&(&/span&&span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&operator&/span&&span class=&p&&.&/span&&span class=&nx&&length&/span& &span class=&o&&&&&/span& &span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&opTop&/span& &span class=&o&&!==&/span& &span class=&s1&&'('&/span&&span class=&p&&){&/span& &span class=&c1&&// 将括号之间的全都处理一遍&/span&
&span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&addNode&/span&&span class=&p&&();&/span&
&span class=&p&&}&/span&
&span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&operator&/span&&span class=&p&&.&/span&&span class=&nx&&pop&/span&&span class=&p&&();&/span& &span class=&c1&&// 弹掉栈顶的'('&/span&
&span class=&k&&break&/span&&span class=&p&&;&/span&
&span class=&k&&case&/span& &span class=&s1&&'%'&/span&&span class=&o&&:&/span&
&span class=&k&&case&/span& &span class=&s1&&'**'&/span&&span class=&o&&:&/span&
&span class=&k&&while&/span& &span class=&p&&(&/span&&span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&operator&/span&&span class=&p&&.&/span&&span class=&nx&&length&/span& &span class=&o&&&&&/span& &span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&opTop&/span& &span class=&o&&===&/span& &span class=&nx&&cur&/span&&span class=&p&&.&/span&&span class=&nx&&value&/span&&span class=&p&&)&/span& &span class=&p&&{&/span&
&span class=&c1&&// 取模与exponential比其他运算符优先级高,所以遇到这两个符号时只能处理剩余的取模和exp&/span&
&span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&addNode&/span&&span class=&p&&();&/span&
&span class=&p&&}&/span&
&span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&operator&/span&&span class=&p&&.&/span&&span class=&nx&&push&/span&&span class=&p&&(&/span&&span class=&nx&&cur&/span&&span class=&p&&.&/span&&span class=&nx&&value&/span&&span class=&p&&);&/span& &span class=&c1&&// 将当前符号加入符号栈&/span&
&span class=&k&&break&/span&&span class=&p&&;&/span&
&span class=&k&&case&/span& &span class=&s1&&'*'&/span&&span class=&o&&:&/span&
&span class=&k&&case&/span& &span class=&s1&&'/'&/span&&span class=&o&&:&/span&
&span class=&k&&while&/span& &span class=&p&&(&/span&&span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&operator&/span&&span class=&p&&.&/span&&span class=&nx&&length&/span& &span class=&o&&&&&/span& &span class=&p&&(&/span&&span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&opTop&/span& &span class=&o&&===&/span& &span class=&s1&&'*'&/span& &span class=&o&&||&/span& &span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&opTop&/span& &span class=&o&&===&/span& &span class=&s1&&'/'&/span&&span class=&p&&))&/span& &span class=&p&&{&/span&
&span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&addNode&/span&&span class=&p&&();&/span& &span class=&c1&&// 乘除&/span&
&span class=&p&&}&/span&
&span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&operator&/span&&span class=&p&&.&/span&&span class=&nx&&push&/span&&span class=&p&&(&/span&&span class=&nx&&cur&/span&&span class=&p&&.&/span&&span class=&nx&&value&/span&&span class=&p&&);&/span&
&span class=&k&&break&/span&&span class=&p&&;&/span&
&span class=&k&&case&/span& &span class=&s1&&'+'&/span&&span class=&o&&:&/span&
&span class=&k&&case&/span& &span class=&s1&&'-'&/span&&span class=&o&&:&/span&
&span class=&k&&while&/span& &span class=&p&&(&/span&&span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&operator&/span&&span class=&p&&.&/span&&span class=&nx&&length&/span& &span class=&o&&&&&/span& &span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&opTop&/span& &span class=&o&&!==&/span& &span class=&s1&&'('&/span& &span class=&o&&&&&/span& &span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&opTop&/span& &span class=&o&&!==&/span& &span class=&s1&&'|'&/span& &span class=&o&&&&&/span& &span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&opTop&/span& &span class=&o&&!==&/span& &span class=&s1&&'&'&/span& &span class=&o&&&&&/span& &span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&opTop&/span& &span class=&o&&!==&/span& &span class=&s1&&'^'&/span&&span class=&p&&)&/span& &span class=&p&&{&/span&
&span class=&c1&&// 处理到这些符号就停止,位运算符号优先级低,不能同时加入树中&/span&
&span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&addNode&/span&&span class=&p&&();&/span&
&span class=&p&&}&/span&
&span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&operator&/span&&span class=&p&&.&/span&&span class=&nx&&push&/span&&span class=&p&&(&/span&&span class=&nx&&cur&/span&&span class=&p&&.&/span&&span class=&nx&&value&/span&&span class=&p&&);&/span&
&span class=&k&&break&/span&&span class=&p&&;&/span&
&span class=&k&&case&/span& &span class=&s1&&'|'&/span&&span class=&o&&:&/span&
&span class=&k&&case&/span& &span class=&s1&&'&'&/span&&span class=&o&&:&/span&
&span class=&k&&case&/span& &span class=&s1&&'^'&/span&&span class=&o&&:&/span&
&span class=&k&&case&/span& &span class=&s1&&'&&'&/span&&span class=&o&&:&/span&
&span class=&k&&case&/span& &span class=&s1&&'&&'&/span&&span class=&o&&:&/span&
&span class=&k&&while&/span&&span class=&p&&(&/span&&span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&operator&/span&&span class=&p&&.&/span&&span class=&nx&&length&/span& &span class=&o&&&&&/span& &span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&opTop&/span& &span class=&o&&!==&/span& &span class=&s1&&'('&/span&&span class=&p&&){&/span&
&span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&addNode&/span&&span class=&p&&();&/span&
&span class=&p&&}&/span&
&span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&operator&/span&&span class=&p&&.&/span&&span class=&nx&&push&/span&&span class=&p&&(&/span&&span class=&nx&&cur&/span&&span class=&p&&.&/span&&span class=&nx&&value&/span&&span class=&p&&);&/span&
&span class=&k&&break&/span&&span class=&p&&;&/span&
&span class=&k&&default&/span&&span class=&o&&:&/span&
&span class=&k&&throw&/span& &span class=&s2&&&Error Operator &&/span& &span class=&o&&+&/span& &span class=&nx&&cur&/span&&span class=&p&&.&/span&&span class=&nx&&value&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&k&&default&/span&&span class=&o&&:&/span&
&span class=&k&&break&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span&
&span class=&k&&while&/span&&span class=&p&&(&/span&&span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&operator&/span&&span class=&p&&.&/span&&span class=&nx&&length&/span&&span class=&p&&){&/span&
&span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&addNode&/span&&span class=&p&&();&/span& &span class=&c1&&// 用剩余的结点把数字栈里解析好的结点组合起来&/span&
&span class=&p&&}&/span&
&span class=&k&&return&/span& &span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&num&/span&&span class=&p&&[&/span&&span class=&mi&&0&/span&&span class=&p&&];&/span& &span class=&c1&&// 最后返回根结点&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&p&我们可以来看一下&code&(1.25+3e-2+1e+3)*5&/code&的建树结果:&/p&&figure&&img src=&https://pic2.zhimg.com/v2-a24d1e29fd_b.jpg& data-size=&normal& data-rawwidth=&1542& data-rawheight=&366& class=&origin_image zh-lightbox-thumb& width=&1542& data-original=&https://pic2.zhimg.com/v2-a24d1e29fd_r.jpg&&&figcaption&对(1.25+3e-2+1e+3)*5建立表达式树&/figcaption&&/figure&&p&求值就非常简单了,我们已经定义了&code&eval()&/code&函数,只需要再调用一下就行。&/p&&p&至此我们的表达式树从简单的词法分析到建立就全部完成了。完整代码如下:&/p&&div class=&highlight&&&pre&&code class=&language-js&&&span&&/span&&span class=&kr&&const&/span& &span class=&nx&&TokenType&/span& &span class=&o&&=&/span& &span class=&p&&{&/span&
&span class=&nx&&OPERATOR&/span&&span class=&o&&:&/span& &span class=&s1&&'OPERATOR'&/span&&span class=&p&&,&/span&
&span class=&nx&&INT&/span&&span class=&o&&:&/span& &span class=&s1&&'INTEGER'&/span&&span class=&p&&,&/span&
&span class=&nx&&DOUBLE&/span&&span class=&o&&:&/span& &span class=&s1&&'DECIMAL'&/span&&span class=&p&&,&/span&
&span class=&p&&}&/span&
&span class=&kr&&const&/span& &span class=&nx&&operator_list&/span& &span class=&o&&=&/span& &span class=&p&&{&/span&
&span class=&s1&&'+'&/span&&span class=&o&&:&/span& &span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&s1&&'-'&/span&&span class=&o&&:&/span& &span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&s1&&'*'&/span&&span class=&o&&:&/span& &span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&s1&&'/'&/span&&span class=&o&&:&/span& &span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&s1&&'%'&/span&&span class=&o&&:&/span& &span class=&mi&&0&/span&&span class=&p&&,&/span&
&span class=&s1&&'&'&/span&&span class=&o&&:&/span& &span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&s1&&'|'&/span&&span class=&o&&:&/span& &span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&s1&&'^'&/span&&span class=&o&&:&/span& &span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&s1&&'**'&/span&&span class=&o&&:&/span& &span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&s1&&'&'&/span&&span class=&o&&:&/span& &span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&s1&&'&'&/span&&span class=&o&&:&/span& &span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&s1&&'~'&/span&&span class=&o&&:&/span& &span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&s1&&'('&/span&&span class=&o&&:&/span& &span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&s1&&')'&/span&&span class=&o&&:&/span& &span class=&mi&&0&/span&
&span class=&p&&}&/span&
&span class=&kr&&class&/span& &span class=&nx&&Token&/span&&span class=&p&&{&/span&
&span class=&nx&&constructor&/span&&span class=&p&&(&/span&&span class=&nx&&value&/span&&span class=&p&&,&/span& &span class=&nx&&tag&/span&&span class=&p&&){&/span&
&span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&value&/span& &span class=&o&&=&/span& &span class=&nx&&value&/span&&span class=&p&&;&/span&
&span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&tag&/span& &span class=&o&&=&/span& &span class=&nx&&tag&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span&
&span class=&kr&&class&/span& &span class=&nx&&Reader&/span&&span class=&p&&{&/span&
&span class=&nx&&constructor&/span&&span class=&p&&(&/span&&span class=&nx&&input_data&/span&&span class=&p&&){&/span&
&span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&seq&/span& &span class=&o&&=&/span& &span class=&nx&&input_data&/span&&span class=&p&&;&/span&
&span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&cursor&/span& &span class=&o&&=&/span& &span class=&mi&&0&/span&&span class=&p&&;&/span&
&span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&urng&/span& &span class=&o&&=&/span& &span class=&nx&&input_data&/span&&span class=&p&&.&/span&&span class=&nx&&length&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&nx&&next&/span&&span class=&p&&()&/span& &span class=&p&&{&/span&
&span class=&k&&return&/span& &span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&seq&/span&&span class=&p&&[&/span&&span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&cursor&/span&&span class=&o&&++&/span&&span class=&p&&];&/span&
&span class=&p&&}&/span&
&span class=&nx&&cursor_data&/span&&span class=&p&&()&/span& &span class=&p&&{&/span&
&span class=&k&&return&/span& &span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&seq&/span&&span class=&p&&[&/span&&span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&cursor&/span&&span class=&p&&]&/span&
&span class=&p&&}&/span&
&span class=&nx&&has_next&/span&&span class=&p&&()&/span& &span class=&p&&{&/span&
&span class=&k&&return&/span& &span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&cursor&/span& &span class=&o&&&&/span& &span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&urng&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&nx&&peek&/span&&span class=&p&&()&/span& &span class=&p&&{&/span&
&span class=&k&&return&/span& &span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&seq&/span&&span class=&p&&[&/span&&span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&nx&&cursor&/span& &span class=&o&&+&/span& &span class=&mi&&1&/span&&span class=&p&&];&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span&
&span class=&kd&&var&/span& &span class=&nx&&reader&/span&&span class=&p&&;&/span&
&span class=&kr&&class&/span& &span class=&nx&&Lexer&/span&&span class=&p&&{&/span&
&span class=&nx&&constructor&/span&&span class=&p&&(&/span&&span class=&nx&&input_expreesion&/span&&span class=&p&&){&/span&
&span class=&nx&&reader&/span& &span class=&o&&=&/span& &span class=&k&&new&/span& &span class=&nx&&Reader&/span&&span class=&p&&(&/span&&span class=&nx&&input_expreesion&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&
&span class=&nx&&parse&/span&&span class=&p&&(){&/span&
&span class=&kd&&var&/span& &span class=&nx&&token_list&/span& &span class=&o&&=&/span& &span class=&p&&[];&/span&
&span class=&kd&&let&/span& &span class=&nx&&last_token&/span& &span class=&o&&=&/span& &span class=&p&&()&/span& &span class=&o&&=&&/span& &span class=&p&&{&/span&&span class=&k&&return&/span& &span class=&nx&&token_list&/span&&span class=&p&&[&/span&&span class=&nx&&token_list&/span&&span class=&p&&.&/span&&span class=&nx&&length&/span& &span class=&o&&-&/span& &span class=&mi&&1&/span&&span class=&p&&]};&/span&
&span class=&kd&&let&/span& &span class=&nx&&is_digit&/span& &span class=&o&&=&/span& &span class=&p&&(&/span&&span class=&nx&&x&/span&&span class=&p&&)&/span& &span class=&o&&=&&/span& &span class=&p&&{&/span&&span class=&k&&return&/span& &span class=&nx&&x&/span& &span class=&o&&&=&/span& &span class=&s1&&'0'&/span& &span class=&o&&&&&/span& &span class=&nx&&x&/span& &span class=&o&&&=&/span& &span class=&s1&&'9'&/span&&span class=&p&&};&/span&
&span class=&kd&&let&/span& &span class=&nx&&is_escape&/span& &span class=&o&&=&/span& &span class=&p&&(&/span&&span class=&nx&&x&/span&&span class=&p&&)&/span& &span class=&o&&=&&/span& &span class=&p&&{&/span&&span class=&k&&return&/span& &span class=&nx&&x&/span& &span class=&o&&===&/span& &span class=&s1&&' '&/span& &span class=&o&&||&/span& &span class=&nx&&x&/span& &span class=&o&&===&/span& &span class=&s1&&'\n'&/span& &span class=&o&&||&/span& &span class=&nx&&x&/span& &span class=&o&&===&/span& &span class=&s1&&'\t'&/span&&span class=&p&&};&/span&
&span class=&kd&&function&/span& &span class=&nx&&readNum&/span&&span class=&p&&()&/span& &span class=&p&&{&/span&
&span class=&kd&&var&/span& &span class=&nx&&ans&/span& &span class=&o&&=&/span& &span class=&p&&{&/span&
&span class=&nx&&v&/span&&span class=&o&&:&/span& &span class=&s1&&''&/span&&span class=&p&&,&/span& &span class=&nx&&t&/span&&span class=&o&&:&/span& &span class=&nx&&TokenType&/span&&span class=&p&&.&/span&&span class=&nx&&INT&/span&
&span class=&p&&};&/span&
&span class=&k&&while&/span&&span class=&p&&(&/span&&span class=&nx&&reader&/span&&span class=&p&&.&/span&&span class=&nx&&has_next&/span&&span class=&p&&()&/span& &span class=&o&&&&&/span& &span class=&p&&(&/span&&span class=&nx&&is_digit&/span&&span class=&p&&(&/span&&span class=&nx&&reader&/span&&span class=&p&&.&/span&&span class=&nx&&cursor_data&/span&&span class=&p&&())&/span& &span class=&o&&||&/span& &span class=&nx&&reader&/span&&span class=&p&&.&/span&&span class=&nx&&cursor_data&/span&&span class=&p&&()&/span& &span class=&o&&===&/span& &span class=&s1&&'.'&/span& &span class=&o&&||&/span& &span class=&nx&&is_escape&/span&&span class=&p&&(&/span&&span class=&nx&&reader&/span&&span class=&p&&.&/span&&span class=&nx&&cursor_data&/span&&span class=&p&&()))){&/span&
&span class=&k&&if&/span&&span class=&p&&(&/span&&span class=&nx&&is_escape&/span&&span class=&p&&(&/span&&span class=&nx&&reader&/span&&span class=&p&&.&/span&&span class=&nx&&cursor_data&/span&&span class=&p&&()))&/span& &span class=&k&&continue&/span&&span class=&p&&;&/span&
&span class=&nx&&ans&/span&&span class=&p&&.&/span&&span class=&nx&&v&/span& &span class=&o&&+=&/span& &span class=&nx&&reader&/span&&span class=&p&&.&/span&&span class=&nx&&next&/span&&span class=&p&&();&/span&
&span class=&p&&}&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&nx&&reader&/span&&span class=&p&&.&/span&&span class=&nx&&has_next&/span&&span class=&p&&()&/span& &span class=&o&&&&&/span& &span class=&nx&&reader&/span&&span class=&p&&.&/span&&span class=&nx&&cursor_data&/span&&span class=&p&&()&/span& &span class=&o&&===&/span& &span class=&s1&&'e'&/span& &span class=&o&&&&&/span& &span class=&p&&(&/span&&span class=&nx&&reader&/span&&span class=&p&&.&/span&&span class=&nx&&peek&/span&&span class=&p&&()&/span& &span class=&o&&===&/span& &span class=&s1&&'-'&/span& &span class=&o&&||&/span& &span class=&nx&&reader&/span&&span class=&p&&.&/span&&span class=&nx&&peek&/span&&span class=&p&&()&/span& &span class=&o&&===&/span& &span class=&s1&&'+'&/span&&span class=&p&&)){&/span&
&span class=&nx&&ans&/span&&span class=&p&&.&/span&&span class=&nx&&v&/span& &span class=&o&&+=&/span& &span class=&nx&&reader&/span&&span class=&p&&.&/span&&span class=&nx&&next&/span&&span class=&p&&()&/span& &span class=&o&&+&/span& &span class=&nx&&reader&/span&&span class=&p&&.&/span&&span class=&nx&&next&/span&&span class=&p&&();&/span&
&span class=&k&&while&/span&&span class=&p&&(&/span&&span class=&nx&&reader&/span&&span class=&p&&.&/span&&span class=&nx&&has_next&/span&&span class=&p&&()&/span& &span class=&o&&&&&/span& &span class=&nx&&is_digit&/span&&span class=&p&&(&/span&&span class=&nx&&reader&/span&&span class=&p&&.&/span&&span class=&nx&&cursor_data&/span&&span class=&p&&())){&/span&
&span class=&nx&&ans&/span&&span class=&p&&.&/span&&span class=&nx&&v&/span& &span class=&o&&+=&/span& &span class=&nx&&reader&/span&&span class=&p&&.&/span&&span class=&nx&&next&/span&&span class=&p&&();&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span&
&span class=&k&&if&/span&&span class=&p&&(&/span&&span class=&nx&&ans&/span&&span class=&p&&.&/span&&span class=&nx&&v&/span&&span class=&p&&.&/span&&span class=&nx&&search&/span&&span class=&p&&(&/span&&span class=&s1&&'.'&/span&&span class=&p&&)&/span& &span class=&o&&!==&/span& &span class=&o&&-&/span&&span class=&mi&&1&/span& &span class=&o&&||&/span& &span class=&nx&&ans&/span&&span class=&p&&.&/span&&span class=&nx&&v&/span&&span class=&p&&.&/span&&span class=&nx&&search&/span&&span class=&p&&(&/span&&span class=&s1&&'e-'&/span&&span class=&p&&)&/span& &span class=&o&&!==&/span& &span class=&o&&-&/span&&span class=&mi&&1&/span&&span class=&p&&){&/span&
&span class=&nx&&ans&/span&&span class=&p&&.&/span&&span class=&nx&&t&/span& &span class=&o&&=&/span& &span class=&nx&&TokenType&/span&&span class=&p&&.&/span&&span class=&nx&&DOUBLE&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&k&&return&/span& &span class=&nx&&ans&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&k&&while&/span& &span class=&p&&(&/span&&span class=&nx&&reader&/span&&span class=&p&&.&/span&&span class=&nx&&has_next&/span&&span class=&p&&()){&/span&
&span class=&kd&&var&/span& &span class=&nx&&cur&/span& &span class=&o&&=&/span& &span class=&nx&&reader&/span&&span class=&p&&.&/span&&span class=&nx&&next&/span&&span class=&p&&();&/span&
&span class=&k&&if&/span&&span class=&p&&(&/span&&span class=&nx&&is_escape&/span&&span class=&p&&(&/span&&span class=&nx&&cur&/span&&span class=&p&&))&/span& &span class=&k&&continue&/span&&span class=&p&&;&/span&
&span class=&k&&if&/span&&span class=&p&&(&/span&&span class=&nx&&is_digit&/span&&span class=&p&&(&/span&&span class=&nx&&cur&/span&&span class=&p&&))&/span& &span class=&p&&{&/span&
&span class=&kd&&var&/span& &span class=&nx&&ret&/span& &span class=&o&&=&/span& &span class=&nx&&readNum&/span&&span class=&p&&();&/span&
&span class=&nx&&token_list&/span&&span class=&p&&.&/span&&span class=&nx&&push&/span&&span class=&p&&(&/span&&span class=&k&&new&/span& &span class=&nx&&Token&/span&&span class=&p&&(&/span&&span class=&nx&&cur&/span& &span class=&o&&+&/span& &span class=&nx&&ret&/span&&span class=&p&&.&/span&&span class=&nx&&v&/span&&span class=&p&&,&/span& &span class=&nx&&ret&/span&&span class=&p&&.&/span&&span class=&nx&&t&/span&&span class=&p&&));&/span&
&span class=&p&&}&/span&&span class=&k&&else&/span& &span class=&k&&if&/span&&span class=&p&&(&/span&&span class=&nx&&cur&/span& &span class=&k&&in&/span& &span class=&nx&&operator_list&/span&&span class=&p&&){&/span&
&span class=&kd&&var&/span& &span class=&nx&&prev&/span& &span class=&o&&=&/span& &span class=&nx&&last_token&/span&&span class=&p&&();&/span&
&span class=&k&&if&/span&&span class=&p&&(&/span&&span class=&k&&typeof&/span& &span class=&nx&&prev&/span& &span class=&o&&!==&/span& &span class=&s1&&'undefined'&/span&&span class=&p&&)&/span& &span class=&nx&&prev&/span& &span class=&o&&=&/span& &span class=&nx&&prev&/span&&span class=&p&&.&/span&&span class=&nx&&tag&/span&&span class=&p&&;&/span&
&span class=&k&&if&/span&&span class=&p&&(&/span&&span class=&nx&&cur&/span& &span class=&o&&===&/span& &span class=&s1&&'-'&/span&&span class=&p&&){&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&k&&typeof&/span& &span class=&nx&&prev&/span& &span class=&o&&!==&/span& &span class=&s1&&'undefined'&/span& &span class=&o&&&&&/span& &span class=&p&&(&/span&&span class=&nx&&prev&/span& &span class=&o&&===&/span& &span class=&nx&&TokenType&/span&&span class=&p&&.&/span&&span class=&nx&&INT&/span& &span class=&o&&||&/span& &span class=&nx&&prev&/span& &span class=&o&&===&/span& &span class=&nx&&TokenType&/span&&span class=&p&&.&/span&&span class=&nx&&DOUBLE&/span&&span class=&p&&)){&/span&
&span class=&nx&&token_list&/span&&span class=&p&&.&/span&&span class=&nx&&push&/span&&span class=&p&&(&/span&&span class=&k&&new&/span& &span class=&nx&&Token&/span&&span class=&p&&(&/span&&span class=&nx&&cur&/span&&span class=&p&&,&/span& &span class=&nx&&TokenType&/span&&span class=&p&&.&/span&&span class=&nx&&OPERATOR&/span&&span class=&p&&));&/span&
&span class=&p&&}&/span&&span class=&k&&else&/span&&span class=&p&&{&/span&
&span class=&kd&&var&/span& &span class=&nx&&ret&/span& &span class=&o&&=&/span& &span class=&nx&&readNum&/span&&span class=&p&&();&/span&
&span class=&nx&&cur&/span& &span class=&o&&+=&/span& &span class=&nx&&ret&/span&&span class=&p&&.&/span&&span class=&nx&&v&/span&&span class=&p&&;&/span&
&span class=&nx&&token_list&/span&&span class=&p&&.&/span&&span class=&nx&&push&/span&&span class=&p&&(&/span&&span class=&k&&new&/span& &span class=&nx&&Token&/span&&span class=&p&&(&/span&&span class=&nx&&cur&/span&&span class=&p&&,&/span& &span class=&nx&&ret&/span&&span class=&p&&.&/span&&span class=&nx&&t&/span&&span class=&p&&));&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span&&span class=&k&&else&/span& &span class=&k&&if&/span&&span class=&p&&(&/span&&span class=&nx&&cur&/span& &span class=&o&&===&/span& &span class=&s1&&'~'&/span&&span class=&p&&){&/span&
&span class=&kd&&var&/span& &span class=&nx&&ret&/span& &span class=&o&&=&/span& &span class=&nx&&readNum&/span&&span class=&p&&();&/span&
&span class=&nx&&token_list&/span&&span class=&p&&.&/span&&span class=&nx&&push&/span&&span class=&p&&(&/span&&span class=&k&&new&/span& &span class=&nx&&Token&/span&&span class=&p&&(&/span&&span class=&nx&&cur&/span& &span class=&o&&+&/span& &span class=&nx&&ret&/span&&span class=&p&&.&/span&&span class=&nx&&v&/span&&span class=&p&&,&/span& &span class=&nx&&TokenType&/span&&span class=&p&&.&/span&&span class=&nx&&INT&/span&&span class=&p&&));&/span&
&span class=&p&&}&/span&&span class=&k&

我要回帖

 

随机推荐