Compare commits

..

No commits in common. "61de3b100f3c6a22d87accfaa8d76b36ddfaeb59" and "6e2b7da22f146140da6db782c74d07826c71d830" have entirely different histories.

10 changed files with 10 additions and 73 deletions

View File

@ -15,7 +15,6 @@
- Watch mode - Watch mode
- Formatter - Formatter
- Simple language server - Simple language server
- Decide how to handle comments in the syntax (?)
## v0.0.10 ## v0.0.10
@ -25,8 +24,8 @@
- [x] Hand-make CLI, remove clap - [x] Hand-make CLI, remove clap
- [x] Compile a single file - [x] Compile a single file
- [x] Display error messages during compilation instead of panicking - [ ] Display error messages during compilation instead of panicking
- [x] Improve error messages - [ ] Improve errror messages
- [ ] Implement code generation for ast nodes implemented as of now - [ ] Implement code generation for ast nodes implemented as of now

View File

@ -1,14 +0,0 @@
use crate::syntax::ast::Block;
use super::Transpilable;
impl Transpilable for Block {
fn transpile(&self) -> String {
// TODO: Handle indentation
self.statements
.iter()
.map(|x| x.transpile())
.collect::<Vec<_>>()
.join("\n")
}
}

View File

@ -4,11 +4,7 @@ use super::Transpilable;
impl Transpilable for FunctionDeclaration { impl Transpilable for FunctionDeclaration {
fn transpile(&self) -> String { fn transpile(&self) -> String {
format!( format!("function {}() {{}}", self.identifier)
"function {}() {{\n{}\n}}",
self.identifier,
self.block.transpile()
)
} }
} }

View File

@ -1,11 +1,9 @@
use crate::syntax::ast::ModuleAST; use crate::syntax::ast::ModuleAST;
mod binding; mod binding;
mod block;
mod expression; mod expression;
mod function_declaration; mod function_declaration;
mod module_ast; mod module_ast;
mod statement;
mod top_level_construct; mod top_level_construct;
/// Trait that the AST and its nodes implement to support transformation to PHP /// Trait that the AST and its nodes implement to support transformation to PHP

View File

@ -11,7 +11,7 @@ impl Transpilable for ModuleAST {
.map(|binding| binding.transpile()) .map(|binding| binding.transpile())
.collect(); .collect();
format!("<?php\n\n{}\n", bindings_str.join("\n")) bindings_str.join("\n")
} }
} }

View File

@ -1,9 +0,0 @@
use crate::syntax::ast::statement::Statement;
use super::Transpilable;
impl Transpilable for Statement {
fn transpile(&self) -> String {
String::from("// TODO (statement)")
}
}

View File

@ -1,29 +1,22 @@
use super::{PrintableError, SyntaxError};
use std::collections::VecDeque; use std::collections::VecDeque;
use super::{PrintableError, SyntaxError};
impl PrintableError for SyntaxError { impl PrintableError for SyntaxError {
fn get_error_str(&self, chars: &Vec<char>) -> String { fn get_error_str(&self, chars: &Vec<char>) -> String {
let (line, before, length) = get_line(chars, self.error_start, self.error_end); let (line, before, length) = get_line(chars, self.error_start, self.error_end);
let line_number = get_line_number(chars, self.error_start);
let line_number_whitespace = " ".repeat(line_number.to_string().len());
let whitespace = vec![' '; before].iter().collect::<String>(); let whitespace = vec![' '; before].iter().collect::<String>();
let indicator = vec!['^'; length].iter().collect::<String>(); let indicator = vec!['^'; length].iter().collect::<String>();
let reason = &self.reason;
format!( format!(
r#" "\n{}\n{}{}\n\n{}{}{}\n{}",
{line_number_whitespace} | line, whitespace, indicator, "Syntax error at pos ", self.error_start, ":", self.reason
{line_number } | {line}
{line_number_whitespace} | {whitespace}{indicator}
{reason} at line {line_number}:{before}"#,
) )
} }
} }
/// Extracts a line of code /// Extracts a lin e of code
/// ///
/// - `chars`: Input where to extract the line from /// - `chars`: Input where to extract the line from
/// - `start_position`: Position where the erroneous code starts /// - `start_position`: Position where the erroneous code starts
@ -97,22 +90,6 @@ fn get_line(
) )
} }
fn get_line_number(chars: &Vec<char>, target_pos: usize) -> usize {
let mut count = 1;
for (pos, char) in chars.iter().enumerate() {
if pos >= target_pos {
break;
}
if *char == '\n' {
count += 1;
}
}
count
}
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::*; use super::*;

View File

@ -449,12 +449,4 @@ mod indentation_tests {
assert_eq!(TokenType::DEDENT, tokens[8].token_type); assert_eq!(TokenType::DEDENT, tokens[8].token_type);
assert_eq!(TokenType::EOF, tokens[9].token_type); assert_eq!(TokenType::EOF, tokens[9].token_type);
} }
#[test]
fn should_lex_comments() {
let input = String::from("// ??");
let tokens = get_tokens(&input).unwrap();
assert_eq!(TokenType::Comment, tokens[0].token_type);
}
} }

View File

@ -18,7 +18,6 @@ pub enum TopLevelDeclaration {
pub struct FunctionDeclaration { pub struct FunctionDeclaration {
pub identifier: Box<String>, pub identifier: Box<String>,
pub params_list: Box<ParamsList>, pub params_list: Box<ParamsList>,
pub block: Box<Block>,
} }
#[derive(Debug)] #[derive(Debug)]

View File

@ -64,7 +64,7 @@ pub fn try_parse<'a>(tokens: &'a Vec<Token>, pos: usize) -> ParseResult<Function
}; };
current_pos = next_pos; current_pos = next_pos;
let (block, next_pos) = match parse_block(tokens, current_pos) { let (_block, next_pos) = match parse_block(tokens, current_pos) {
ParseResult::Ok(block, next_pos) => (block, next_pos), ParseResult::Ok(block, next_pos) => (block, next_pos),
ParseResult::Err(error) => { ParseResult::Err(error) => {
return ParseResult::Err(error); return ParseResult::Err(error);
@ -91,7 +91,6 @@ pub fn try_parse<'a>(tokens: &'a Vec<Token>, pos: usize) -> ParseResult<Function
FunctionDeclaration { FunctionDeclaration {
identifier: Box::new(identifier.value.clone()), identifier: Box::new(identifier.value.clone()),
params_list: Box::new(params_list), params_list: Box::new(params_list),
block: Box::new(block),
}, },
current_pos, current_pos,
) )