编译原理实战入门:用 JavaScript 写一个简单的四则运算编译器(一)词法分析
栏目: JavaScript · 发布时间: 6年前
内容简介:编译器是一个程序,作用是将一门语言翻译成另一门语言。一般的程序,CPU 是无法直接执行的,因为 CPU 只能识别机器指令。所以要想执行一个程序,首先要将高级语言编写的程序翻译为汇编代码,再将汇编代码翻译为机器指令,这样 CPU 才能识别并执行。示例:
编译器
编译器是一个程序,作用是将一门语言翻译成另一门语言。
一般的程序,CPU 是无法直接执行的,因为 CPU 只能识别机器指令。所以要想执行一个程序,首先要将高级语言编写的程序翻译为汇编代码,再将汇编代码翻译为机器指令,这样 CPU 才能识别并执行。
示例:
// CPU 无法识别 10 + 5 // 翻译成汇编语言 push 10 push 5 add // 最后翻译为机器指令 汇编代码和机器指令一一对应 // 机器指令由 1 和 0 组成,以下指令非真实指令,只做演示用 0011101001010101 1101010011100101 0010100111100001
学会编译原理有什么好处?
对编译过程内部原理的掌握将会使你成为更好的高级程序员。
词法分析
程序其实就是保存在文本文件中的一系列字符,词法分析的作用是将这一系列字符按照某种规则分解成一个个字元(token,也称为终结符),忽略空格和注释。
示例:
// 程序代码 10 + 5 + 6 // 词法分析后得到的 token 10 + 5 + 6
终结符
终结符就是语言中用到的基本元素,一般不能再被分解。
四则运算中的终结符包括符号和整数常量(暂不支持一元操作符)。
符号: + - * / ( )
整数常量:12、1000、111...
词法分析代码实现
function lexicalAnalysis(expression) {
const symbol = ['(', ')', '+', '-', '*', '/']
const re = /\d/
const tokens = []
const chars = expression.trim().split('')
let token = ''
chars.forEach(c => {
if (re.test(c)) {
token += c
} else if (c == ' ' && token) {
tokens.push(token)
token = ''
} else if (symbol.includes(c)) {
if (token) {
tokens.push(token)
token = ''
}
tokens.push(c)
}
})
if (token) {
tokens.push(token)
}
return tokens
}
console.log(lexicalAnalysis('100 + 23 + 34 * 10 / 2'))
// ["100", "+", "23", "+", "34", "*", "10", "/", "2"]
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
汇编语言(第3版)
王爽 / 清华大学出版社 / 2013-9 / 36.00元
《汇编语言(第3版)》具有如下特点:采用了全新的结构对课程的内容进行组织,对知识进行最小化分割,为读者构造了循序渐进的学习线索;在深入本质的层面上对汇编语言进行讲解;对关键环节进行深入的剖析。《汇编语言(第3版)》可用作大学计算机专业本科生的汇编教材及希望深入学习计算机科学的读者的自学教材。一起来看看 《汇编语言(第3版)》 这本书的介绍吧!