博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[译] 用javascript实现一门编程语言-写一个解析器
阅读量:5957 次
发布时间:2019-06-19

本文共 1196 字,大约阅读时间需要 3 分钟。

目录

写一个解析器

解析器的实现是需要根据语言特性来实现的,是一个较为复杂的任务。事实上,我们需要将一段代码或者字母转换为抽象语法树 (abstract syntax tree, AST)。抽象语法树是程序在内存中展现的一种形式,抽象表示它不关心是由什么源码构成的,但是他很确信是符合语义学的。

例如:

sum = lambda(a, b) {    a + b;}print(sum(1, 2));复制代码

解析器会将上面的代码转换为一个javascript对象:

{  type: "prog",  prog: [    // 第一行    {      type: "assign",      operator: "=",      left: { type: "var", value: "sum" },      right: {        type: "lambda",        vars: [ "a", "b" ],        body: {          // body 部分也应该是 prog 类型,因为它包含一个表达式          type: "binary",          operator: "+",          left: { type: "var", value: "a" },          right: { type: "var", value: "b" }        }      }    },    // 第二行    {      type: "call",      func: { type: "var", value: "print" },      args: [{        type: "call",        func: { type: "var", value: "sum" },        args: [ { type: "num", value: 1 },                { type: "num", value: 2 } ]      }]    }  ]}复制代码

写一个解析器最大的困难在于如何合理的组织代码。解析器应该站在比读取字符更高的层面。这里有一些建来控制程序的适度的复杂性:

  • 写小而精的函数。每个函数只做一件事,并把它做好。
  • 不要用正则表达式去解析。在写词法分析器的时候正则表达式很有用,但是建议尽量不要把它用在很简单的事情上
  • 不要尝试去猜。当不确定解析什么的时候,抛出一个包含位置的错误,比如: 第2行25列错误

为了保持胆码的简洁性,我将代码分割成了三部分,将来会被分割成更小的函数:

  • 字符输入流
  • token输入流
  • 解析器

原文链接:

转载于:https://juejin.im/post/5b640945e51d4519226fa175

你可能感兴趣的文章
正则表达式的贪婪与非贪婪模式
查看>>
二进制翻译
查看>>
AOP和OOP的区别
查看>>
js中的 substring和substr方法
查看>>
wpf 界面加载 Command
查看>>
今 天看到我十年前的一篇技术文章,想到不知不觉学编程十多年了,,
查看>>
DOM(十四):代理检测和事件处理(跨浏览器)
查看>>
SqlServer存储过程调用接口
查看>>
ZOJ 3817Chinese Knot(The 2014 ACM-ICPC Asia Mudanjiang Regional First Round)
查看>>
一到十二月单词
查看>>
【算法】2 由股票收益问题再看分治算法和递归式
查看>>
Golang 笔记 2 函数、结构体、接口、指针
查看>>
Swift4 - 动态计算UITableView中tableHeaderView的高度 - 获取子控件高度和宽度
查看>>
java学习中,instanceof 关键字 和 final 关键字、值的传递(java 学习中的小记录)...
查看>>
数据结构 --- 线性表学习(php模拟)
查看>>
URAL 1081 Binary Lexicographic Sequence
查看>>
Codeforces 797B - Odd sum
查看>>
文章页调用栏目链接和栏目名称的方法
查看>>
Oracle数据库日期格式转换操作
查看>>
Play framework 2.0 -应用程序全局设置(转)
查看>>