From 35bf004cc923c1bd61a75fa0ff9b336644f0c8b0 Mon Sep 17 00:00:00 2001 From: David Li Date: Sat, 4 Nov 2017 08:34:52 -0400 Subject: Add location information to AST --- src/ast.rs | 24 +++++++++++++++++++++++- src/taiga.lalrpop | 12 ++++++++---- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/src/ast.rs b/src/ast.rs index b5f2049..3863ce9 100644 --- a/src/ast.rs +++ b/src/ast.rs @@ -1,5 +1,27 @@ #[derive(Debug)] -pub struct Program(pub Box); +pub struct WithLocation { + value: T, + location: (usize, usize), +} + +impl WithLocation { + pub fn new(value: T, start: usize, end: usize) -> WithLocation { + WithLocation { + value: value, + location: (start, end), + } + } + + pub fn map U>(self, f: F) -> WithLocation { + WithLocation { + value: f(self.value), + location: self.location, + } + } +} + +#[derive(Debug)] +pub struct Program(pub Box>); #[derive(Debug)] pub enum Expression { diff --git a/src/taiga.lalrpop b/src/taiga.lalrpop index b60d68f..08c3cd3 100644 --- a/src/taiga.lalrpop +++ b/src/taiga.lalrpop @@ -1,5 +1,5 @@ use std::str::FromStr; -use ast; +use ast::{self, WithLocation}; grammar; @@ -7,8 +7,12 @@ pub Program: ast::Program = { Expression => ast::Program(<>), }; -Expression: Box = { - Num => Box::new(ast::Expression::Number(<>)), +Expression: Box> = { + Num => Box::new(<>.map(|v| ast::Expression::Number(v))), }; -Num: u64 = r"[0-9]+" => u64::from_str(<>).unwrap(); +Num: WithLocation = > => e.map(|v| u64::from_str(v).unwrap()); + +Spanned: WithLocation = { + => WithLocation::new(v, l, r) +}; -- cgit v1.2.3