在Swift中实现编程语言—第5部分:Main函数

这是“用Swift编写编程语言”教程系列的第五部分。请务必阅读第4部分。

在之前的教程中,我们完成了为计算器实现Lexer和Parser的工作。 现在,剩下的一切我都可以简单地遍历AST并“解释”一些输出。

所以……快到了!

您可能已经注意到,我们在解析时创建的NodesFloatInfixOperation )很容易将两个值都评估为Float值。 因此,要评估AST,我们要做的就是向Node协议添加一种协议方法,以解释每个单个Node并在Node结构中实现它:

 协议节点{ 
  func interpret()throws-> Float 
  } 
  // ... 
 扩展浮动:节点{ 
  func interpret()throws-> Float { 
 返回自我 
  } 
  } 
  struct InfixOperation:节点{ 
  // ... 
  func interpret()throws-> Float { 
 让左=尝试lhs.interpret() 
 让权利=尝试rhs.interpret() 
 切换op { 
 案例.divideBy: 
 返回左/右 
 案例时间: 
 返回左*右 
 大小写减号: 
 返回左-右 
 案例.plus: 
 返回左+右 
  } 
  } 
}

就是这样,现在我们已经准备好创建我们的main函数,让我们称之为run

  func run(code:String)抛出{ 
  let令牌= Lexer(代码:代码).tokens 
 让解析器=解析器(令牌:令牌) 
 让ast =试试parser.parse() 
 打印(ast.interpret()) 
  } 
 让代码=“ 4 + 2 * 5 + 3 *(1 + 4)” 
 运行(代码:代码)//输出:29 

恭喜你! 现在,我们有了一个可以正常运行的计算器。

它看起来并不多,但是正如您将在以后的教程中注意到的那样,添加编程语言功能(例如变量和函数)并不是特别困难。

下一步

合理的下一步是将其包装到命令行工具中。 每种编程语言都有一种。

迅速的明星约翰·桑德尔(John Sundell)在这方面发布了很好的教程,我将在此处留下一个链接,供您关注。 无需付出太多努力,您就可以在终端中使用命令来运行我们的代码:

  >我的解释器“(2 + 3)* 5” 
> 25

但是,我们的下一步将是将简单的计算器语言转变为类似于编程语言的语言。 从添加变量开始。

敬请关注!