查字典图书网
当前位置: 查字典 > 图书网 > 编程 > 两周自制脚本语言 > 试读

两周自制脚本语言[试读]

1.1 机器语言与汇编语言

——某大学研究室内 C 话说,我现在正在写一本新书。 H 老师,您这次写的是什么主题的书呢? C 是一本和编译相关的书。确切地说,是关于语言处理器的书。 F 这样啊,这次是要写成一本教科书吗? C 不,出版社要求我这次写得通俗些,所以这本书的内容会比教材来得简单。 H 那这次还会像前... 查看全部[ 1.1 机器语言与汇编语言 ]

1.2 解释器与编译器

语言处理器可大致分为解释器与编译器两种。这两类语言处理器的执行原理有很大差异。 解释器 解释器根据程序中的算法执行运算。简单来讲,它是一种用于执行程序的软件。如果执行的程序由虚拟机器语言或类似于机器语言的程序设计语言写成,这种软件也能称为虚拟机。 编译器 编译器能将某种语言写成的程序... 查看全部[ 1.2 解释器与编译器 ]

1.3 开发语言处理器

本书将为极为简单的脚本语言开发语言处理器。由于对象是脚本语言,所以如果按上一节的分类方式,本书开发的语言处理器属于解释器。不过,该解释器内部将采用编译器来提高性能,因此本书也将涉及开发编译器的一些基本知识。本书不包含代码优化之类的技巧,因此不会介绍诸如编译器在将程序转换为机器语言时,如何提高机器语言... 查看全部[ 1.3 开发语言处理器 ]

1.4 语言处理器的结构与本书的框架

无论是解释器还是编译器,语言处理器前半部分的程序结构都大同小异。如图1.1所示,源代码首先将进行词法分析,由一长串字符串细分为多个更小的字符串单元。分割后的字符串称为单词。之后处理器将执行语法分析处理,把单词的排列转换为抽象语法树。至此为止,解释器与编译器的处理方式相同。之后,编译器将会把抽象语法树... 查看全部[ 1.4 语言处理器的结构与本书的框架 ]

2.1 麻雀虽小、五脏俱全的程序设计语言

从本章开始,我们将逐步实现一种名为Stone语言的程序设计语言。在具体实现之前,我们必须设计Stone语言的语法。本章将讨论如何设计Stone语言。如果想要从零开始设计一种新颖实用的语言,结果往往是半途而废。即使设计成功,也可能由于过于复杂难以实现等原因而最终不了了之。因此,本书将首先设计一种极为简... 查看全部[ 2.1 麻雀虽小、五脏俱全的程序设计语言 ]

2.2 句尾的分号

Stone语言为了简化语法,省去了if语句及while语句的条件表达式两侧的括号,并允许用户省略可以省略的句尾分号。如果同一行中写有多句语句,各句句尾的分号则不能省略。此时,分号用于区分不同的语句。 此外,{}括起来的代码块中最后一条语句的句尾分号能够省略。也就是说,如果句尾直接跟着},就不必使用... 查看全部[ 2.2 句尾的分号 ]

2.3 含糊不得的语言

如果代码中能够随处省略分号,并可以任意换行,似乎可读性就会提升。但要是一种程序设计语言的各种语法元素都能省略,语句中任何地方都能换行,它就可能会变得模棱两可,引起误解。 如果语言的含义不清,程序员就无法判断程序的实际执行方式,这会造成很大的麻烦。事实上,如何为这种语言设计语言处理器也很让人头疼。在... 查看全部[ 2.3 含糊不得的语言 ]

3.1 Token对象

语言处理器的第一个组成部分是词法分析器(lexical analyzer、lexer或scanner)。程序的源代码最初只是一长串字符串。从内部来看,源代码中的换行也能用专门的(不可见)换行符表示,因此整个源代码是一种相连的长字符串。这样的长字符串很难处理,语言处理器通常会首先将字符串中的字符以单词... 查看全部[ 3.1 Token对象 ]

3.2 通过正则表达式定义单词

要设计词法分析器,首先要考虑每一种类型的单词的定义,规定怎样的字符串才能构成一个单词。这里最重要的是不能有歧义。某个特定的字符串只能是某种特定类型的单词。举例来讲,要是字符串123h既能被解释为标识符,又能被解释为整型字面量,之后的处理就会相当麻烦。这种单词的定义方式是不可取的。 代码清单3.1... 查看全部[ 3.2 通过正则表达式定义单词 ]

3.3 借助java.util.regex设计词法分析器

只要能够通过正则表达式来表示单词的定义,词法分析器的设计就没有太大的困难。Java语言的正则表达式库能够在模式匹配后返回匹配的字符串中的一部分,本书将利用这一功能来实现词法分析器。例如,下面的字符串 http://javassist.org/ 与正则表达式 http://(.+)/... 查看全部[ 3.3 借助java.util.regex设计词法分析器 ]

3.4 词法分析器试运行

本章的最后将尝试运行由代码清单3.3的Lexer类实现的词法分析器。相应的main方法如代码清单3.5所示。它将对输入的字符串做词法分析,并逐行显示分析得到的每一个单词(图3.1)。 代码清单3.6中的CodeDialog对象是Lexer类的构造函数中的参数。CodeDialog是java.io.... 查看全部[ 3.4 词法分析器试运行 ]