1.如何使用浏览器自带的JS解释器编写多行代码
第一步,打开浏览器,随便打开一个网页,如百度首页
按F12快捷键后,在网页的右面或者下面会出现如图所示的调试窗口,
浏览器自带的console控制台有提示的功能哦,初学前端的同学一定都不熟悉js函数,可以用这个提示哦
第一个我们要做的是在控制台打印“helloworld”程序
但是当我们想连续输出两行打印语句发现在控制台里按住回车键以后是直接解释执行,根本无法连续编写两行代码
其实,只是一个技巧,但是好多人却不知道,初学前端的朋友也不知怎么搜索解决,当我们想换行的时候,按住shift键以后,再按回车,即可出现上图的效果。最后安利一个功能:当想重复输入某个语句的时候,只需要按向上的箭头就可以快速生成已经编译的语句
2.javascript解释器是什么
就是执行你的javascript代码的东东,就像你的java代码由JVM执行,javascript是由javascript解释器执行,浏览器中一般都会包含这个
每个浏览器的并不一样,一般都包含在各浏览器的内核中
浏览器内核一般包含两个引擎:页面排版引擎 和 JS引擎
IE的 使用的自己的Trident 内核
FireFox 是Gecko内核
Opera 是Presto内核
Safari 使用的Webkit 内核
Chrome 是Google自己的 javascript V8引擎 而其页面排版采用的Webkit 内核
3.如何愉快地写个小parser
如何愉快地写个小parser 在前几日的文章『软件随想录』里,我随性写了一句:「现在似乎已经不是lex/yacc 或 bison/flex的时代了。
我亲眼看见一个同事在费力地用perl一行行解析某个系统的数据文件,却压根没想到写个BNF。BNF对他来说,不是一种选择。
」 很多同学不解,问我:lex/yacc不是写编译器 [1] 的么?我又不发明新的语言,它们对我有什么用?从这个问题里,我们可以见到国内本科教育荼毒之深。象牙塔里的讲编译原理的老师们,估计用lex/yacc也就是写过个毫无用处的toy language,然后把自己的一知半解传递给了他们的学生,学生们学得半通不通,兴趣索然,考完试之后便把死记硬背的内容如数奉还给了老师。
别笑,我还真就是这么过来的。我用lex/yacc干的唯一一件事,就是TMD设计一个语言。
这世间的语言如此之多,实在容不下我等庸人再设计一门蹩脚的,捉急的,没有颜值,没有性能的语言。况且2000年左右的时候还没有LLVM这种神器,也没有github这样的冥想盆去「偷」别人的思想,设计出来的蹩脚语言只能到语法分析这一步就停下来,没有任何实际用处。
后来lex/yacc进化成flex/bison,在工作中我也无意中翻看了一本orelley叫『Flex & Bison』的书,这书的副标题赫然写着:text processing tools。书的内容还是挺教条的,和实际的工作内容略微脱节,可text processing tools这个说法戳中了我:是啊,词法分析 - lexical parsing(lex/flex),语法分析 - grammar parsing(yacc/bison)只是更好的文本处理工具(parser),是个高效处理带有语法的文本的DSL(Domain Specific Language)!它们和编译器没有半毛钱关系,只不过,它们的某一个应用场景是和编译器有关罢了。
我们不必将其想得过于高深!我们想想文本处理有什么工具?Regular expression!如今的编程语言,有哪个不支持regular expression呢?同样的,如今的程序员,哪个不用使用(没在代码里使用)regular expression呢?Regular expression也是一种文本处理工具,也是个DSL,只不过,它处理不了复杂的语法。我们知道,自动化理论(automata theory)里,有FSA(Finite State Automata)和PDA(PushDown Automata),前者可以用regular expression表述,而后者可以处理CFG(Context Free Grammar)。
而CFG便是flex/bison要处理的对象!遗憾的是,大部分语言都没有内置对CFG的处理,一旦文本处理的复杂度超过了regular expression可以表述的复杂度,我们便无能为力。举个例子,如果要你解析这样一段文本,你该怎么做?用regular expression自然是无能为力的,一个字符一个字符读入,按单词切分token,然后处理大括号,分号这样的语法,你相当于自己写了个解析器,很难保证高效和可扩展。
所以这种时候我们需要求助于第三方的flex/bison,或者类似的工具。flex是lex演进过来的,做词法分析。
所谓的词法分析,说白了就是把文本切成一个个你认识的语法单元,比如上图里,server 就是这样一个语法单元,我们管这个单元叫token。在flex里,我们可以这样描述上面文本里出现的token:接下来就是语法分析的环节了。
语法分析做的是pattern matching的事情,和regular expression的pattern matching不同,它允许你定义一系列可递归的规则。标准的unix下,语法分析的工具是bison,我们看看上述文本如何使用bison解析:其主体代码还是很清晰的,一个 server {…} 就用 SERVER OP({) exp_list CP(}) 这样一条规则匹配,当解析器碰到 exp_list 这样一个它无法认识的内容时,它会寻找名为 exp_list 的规则继续匹配。
如果你经常使用函数式编程语言,你会发现,这种规则的撰写似曾相识。bison使用的描述规则的语法是BNF的变体。
以下是编译和执行的结果,作为展示,我仅仅把语法树中我感兴趣的内容打印出来了:从上面的编译过程里,你可以看到,flex/bison是一个C语言的DSL。因此,你可以在处理词法和语法的过程中嵌入C代码,处理(transform)你需要的结果。
DSL和宿主语言之间必然要有一些约定俗成的接口,这也是 yytext,yyparser,yyterminate,yylex 等等变量和方法存在的原因。它们看起来很奇怪,但如果你以一颗看待DSL的心去看待它们,变不那么别扭了。
(二) 可惜,如今大部分文艺青年都已经不用C了 —— 虽说很多语言都提供了对C的FFI(Foreign Function Interface),比如Python,你可以用flex/bison生成一个parser,然后用FFI包装。然而,这毕竟很麻烦,如果我能用我喜爱的语言做parser,该多方便?嗯,有需求的地方便有产品,看这个wiki page吧:中的js代码中怎么写一个计算器的加减乘除
<meta ; charset=utf-8" />