From 9f393b2eb7b3fb8f1924e80095bad3384049cc67 Mon Sep 17 00:00:00 2001
From: David Li
Date: Sat, 4 Nov 2017 20:15:20 -0400
Subject: Parse let expressions
---
src/ast.rs | 19 +++++++++++++++++++
src/taiga.lalrpop | 19 +++++++++++++++++++
2 files changed, 38 insertions(+)
diff --git a/src/ast.rs b/src/ast.rs
index 22d968e..7edf9c7 100644
--- a/src/ast.rs
+++ b/src/ast.rs
@@ -60,6 +60,7 @@ pub enum BinOp {
#[derive(Debug)]
pub enum Expression {
+ Let(Vec>, Box>),
UnaryOp(UnaryOp, Box>),
BinOp(BinOp, Box>, Box>),
Number(u64),
@@ -67,3 +68,21 @@ pub enum Expression {
Name(String),
Nil,
}
+
+#[derive(Debug)]
+pub struct VarDec {
+ name: WithLocation,
+ type_: Option,
+ value: Box>,
+}
+
+impl VarDec {
+ pub fn new(name: WithLocation, type_: Option,
+ value: Box>) -> VarDec {
+ VarDec {
+ name: name,
+ type_: type_,
+ value: value,
+ }
+ }
+}
diff --git a/src/taiga.lalrpop b/src/taiga.lalrpop
index be47147..851cb24 100644
--- a/src/taiga.lalrpop
+++ b/src/taiga.lalrpop
@@ -7,6 +7,19 @@ pub Program: ast::Program = {
Expression => ast::Program(<>),
};
+VarDec: Box> =
+ "var" "=" =>
+ Box::new(WithLocation::new(ast::VarDec::new(name, None, exp), l, r));
+
+DeclarationsList: Vec> = {
+ => {
+ let mut h = h;
+ h.push(*t);
+ h
+ },
+ => vec![*<>],
+};
+
Expression: Box> = {
"&&" => Box::new(e1.join_map(*e2, |v1, v2| {
ast::Expression::BinOp(ast::BinOp::And, Box::new(v1), Box::new(v2))
@@ -87,6 +100,8 @@ ExpressionBase: Box> = {
String => Box::new(<>.map(|v| ast::Expression::String(v))),
Name => Box::new(<>.map(|v| ast::Expression::Name(v))),
Spanned => Box::new(<>.map(|v| ast::Expression::Nil)),
+ "let" "in" "end" =>
+ Box::new(WithLocation::new(ast::Expression::Let(d, e), l, r)),
"(" ")" => <>,
};
@@ -102,6 +117,10 @@ Spanned: WithLocation = {
match {
"nil",
+ "var",
+ "let",
+ "in",
+ "end",
}
else {
r"[[:alpha:]_][[:alpha:]_0-9]*",
--
cgit v1.2.3