Skip to content

Commit a15e775

Browse files
committed
m o r e r e f a c t o r i n g
1 parent d9170c9 commit a15e775

33 files changed

+471
-471
lines changed

packages/engine/src/cursor.rs

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -67,24 +67,3 @@ impl Cursor {
6767
self.2
6868
}
6969
}
70-
71-
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
72-
pub struct WithCursor<T> {
73-
pub value: T,
74-
pub start: Cursor,
75-
pub end: Cursor,
76-
}
77-
78-
impl<T> WithCursor<T> {
79-
pub fn create(value: T) -> Self {
80-
Self::create_with(Cursor::create(), Cursor::create(), value)
81-
}
82-
83-
pub fn create_with(start: Cursor, end: Cursor, value: T) -> Self {
84-
Self {
85-
start,
86-
end,
87-
value,
88-
}
89-
}
90-
}

packages/engine/src/engine.rs

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
use std::path::PathBuf;
2+
use crate::component::ComponentErrors;
3+
use crate::error::{EngineErrorKind, EngineResult};
4+
use crate::lexer::Lexer;
5+
use crate::parser::Parser;
6+
7+
pub struct Engine {}
8+
9+
impl Engine {
10+
pub fn create() -> Self {
11+
debug!("created engine");
12+
Self {}
13+
}
14+
15+
pub fn exec_file(&mut self, file: &PathBuf) -> EngineResult<i32> {
16+
debug!("executing file {file:?}");
17+
18+
let code = if file.is_file() && (file.is_absolute() || file.is_relative()) {
19+
std::fs::read_to_string(file).map_err(|_| EngineErrorKind::UnknownError)?
20+
} else {
21+
return Err(EngineErrorKind::UnknownError);
22+
};
23+
24+
let mut lexer = Lexer::create(
25+
&code,
26+
#[cfg(feature = "cli")]
27+
Some(file.clone()),
28+
);
29+
self.exec_post(&mut lexer)
30+
}
31+
32+
pub fn exec(&mut self, code: &str) -> EngineResult<i32> {
33+
debug!("executing script");
34+
35+
let mut lexer = Lexer::create(
36+
code,
37+
#[cfg(feature = "cli")]
38+
None,
39+
);
40+
self.exec_post(&mut lexer)
41+
}
42+
43+
fn exec_post(&mut self, lexer: &mut Lexer) -> EngineResult<i32> {
44+
#[cfg(feature = "cli")]
45+
let source_file = lexer.source().clone();
46+
47+
lexer.tokens();
48+
if lexer.has_errors() {
49+
lexer.print_errors();
50+
return Ok(1);
51+
}
52+
53+
let mut parser = Parser::create(
54+
lexer.tokens(),
55+
#[cfg(feature = "cli")]
56+
source_file,
57+
);
58+
59+
parser.parse();
60+
parser.print_errors();
61+
62+
// let mut transpiler = Transpiler::create(&transpiler::TranspilerTarget::Bash, parser.parse());
63+
// println!("---START---\n{}\n---END---", transpiler.transpile());
64+
65+
66+
Ok(0)
67+
}
68+
}

packages/engine/src/lib.rs

Lines changed: 10 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -6,79 +6,21 @@
66
#[macro_use]
77
extern crate log;
88

9-
use std::path::PathBuf;
10-
use component::ComponentErrors;
11-
use error::EngineResult;
12-
use lexer::Lexer;
13-
use parser::Parser;
14-
159
pub mod component;
1610
pub mod constants;
1711
pub mod cursor;
1812
pub mod error;
1913
pub mod lexer;
2014
pub mod parser;
2115
pub mod transpiler;
22-
23-
pub struct Engine {}
24-
25-
impl Engine {
26-
pub fn create() -> Self {
27-
debug!("created engine");
28-
Self {}
29-
}
30-
31-
pub fn exec_file(&mut self, file: &PathBuf) -> EngineResult<i32> {
32-
debug!("executing file {file:?}");
33-
34-
let code = if file.is_file() && (file.is_absolute() || file.is_relative()) {
35-
std::fs::read_to_string(file).map_err(|_| error::EngineErrorKind::UnknownError)?
36-
} else {
37-
return Err(error::EngineErrorKind::UnknownError);
38-
};
39-
40-
let mut lexer = Lexer::create(
41-
&code,
42-
#[cfg(feature = "cli")]
43-
Some(file.clone()),
44-
);
45-
self.exec_post(&mut lexer)
46-
}
47-
48-
pub fn exec(&mut self, code: &str) -> EngineResult<i32> {
49-
debug!("executing script");
50-
51-
let mut lexer = Lexer::create(
52-
code,
53-
#[cfg(feature = "cli")]
54-
None,
55-
);
56-
self.exec_post(&mut lexer)
57-
}
58-
59-
fn exec_post(&mut self, lexer: &mut Lexer) -> EngineResult<i32> {
60-
#[cfg(feature = "cli")]
61-
let source_file = lexer.source().clone();
62-
63-
lexer.tokens();
64-
if lexer.has_errors() {
65-
lexer.print_errors();
66-
return Ok(1);
16+
pub mod engine;
17+
18+
#[macro_export]
19+
macro_rules! ok_or_none {
20+
($expr:expr) => {
21+
match $expr {
22+
Some(val) => val,
23+
None => return Ok(None),
6724
}
68-
69-
let mut parser = Parser::create(
70-
lexer.tokens(),
71-
#[cfg(feature = "cli")]
72-
source_file,
73-
);
74-
75-
parser.parse();
76-
parser.print_errors();
77-
78-
// let mut transpiler = Transpiler::create(&transpiler::TranspilerTarget::Bash, parser.parse());
79-
// println!("---START---\n{}\n---END---", transpiler.transpile());
80-
81-
82-
Ok(0)
83-
}
84-
}
25+
};
26+
}

packages/engine/src/parser/ast.rs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,18 @@ macro_rules! parseable {
2121
}
2222

2323
#[macro_export]
24-
macro_rules! parse {
24+
macro_rules! parse_expr {
2525
($parser:expr, $expr:ident = $name:ty) => {
26-
let Some($expr) = <$name>::parse($parser)? else {
27-
return Ok(None);
26+
let start = $parser.cursor;
27+
let kind = $crate::ok_or_none!(<$name>::parse($parser)?);
28+
let end = $parser.cursor;
29+
30+
let kind = {
31+
use $crate::parser::ast::ToExpressionKind;
32+
kind.as_expr_kind()
2833
};
34+
35+
let $expr = $crate::parser::expr::Expression::new(start, kind, end);
2936
};
3037
}
3138

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::{to_expr_kind, ast, parse, parse_bin_op, parseable, parser::{ast::ToExpressionKind, expr::{bin_op::BinOp, Expression, Or}}};
1+
use crate::{ast, parse_bin_op, parse_expr, parseable, parser::expr::{Expression, Or}, to_expr_kind};
22

33
ast!(And(Expression, Expression));
44
to_expr_kind!(And);
@@ -17,28 +17,30 @@ parse_bin_op! {
1717

1818
parseable! {
1919
And = |parser| {
20-
parse!(parser, lhs = Or);
21-
parse!(parser, rhs = Or);
22-
Ok(Some(And(lhs.as_expr_kind(), rhs.as_expr_kind())))
20+
parse_expr!(parser, lhs = Or);
21+
parse_expr!(parser, rhs = Or);
22+
Ok(Some(And(lhs, rhs)))
2323
}
2424
}
2525

26-
// let_expr!(mut lhs = self.expr_logic_and()?);
26+
// fn expr_logic_and(&mut self) -> ParserResult<Option<WithCursor<ExpressionKind>>> {
27+
// let_expr!(mut lhs = self.expr_cmp_equality()?);
2728

28-
// while let Some(token_or) = self.next_if_eq(&&LexerTokenKind::Or) {
29-
// let_expr!(rhs = self.expr_logic_and()?);
29+
// while let Some(token_and) = self.next_if_eq(&&LexerTokenKind::And) {
30+
// let_expr!(rhs = self.expr_cmp_equality()?);
3031

31-
// let operator: LogicalOperator = LogicalOperator::Or;
32+
// let operator: LogicalOperator = LogicalOperator::And;
3233

33-
// lhs = WithCursor::create_with(
34-
// lhs.start,
35-
// rhs.end,
36-
// ExpressionKind::Logic(Box::from((
37-
// lhs,
38-
// WithCursor::create_with(token_or.start, token_or.end, operator),
39-
// rhs,
40-
// ))),
41-
// );
42-
// }
34+
// lhs = WithCursor::create_with(
35+
// lhs.start,
36+
// rhs.end,
37+
// ExpressionKind::Logic(Box::from((
38+
// lhs,
39+
// WithCursor::create_with(token_and.start, token_and.end, operator),
40+
// rhs,
41+
// ))),
42+
// );
43+
// }
4344

44-
// Ok(Some(lhs))
45+
// Ok(Some(lhs))
46+
// }
File renamed without changes.
File renamed without changes.

packages/engine/src/parser/expr/block_expr.rs renamed to packages/engine/src/parser/expr/expr_block.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::{to_expr_kind, ast, parseable, parser::stmt::Statement};
1+
use crate::{ast, ok_or_none, parseable, parser::stmt::Statement, to_expr_kind};
22

33
ast!(Block(Vec<Statement>));
44
to_expr_kind!(Block);
@@ -15,7 +15,7 @@ parseable! {
1515
break;
1616
}
1717

18-
let statement = parser.parse_statement(token)?;
18+
let statement = ok_or_none!(parser.statement(token)?);
1919
statements.push(statement);
2020

2121
parser.next();

packages/engine/src/parser/expr/function_call_expr.rs renamed to packages/engine/src/parser/expr/expr_function_call.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::{to_expr_kind, ast, parseable};
1+
use crate::{ast, ok_or_none, parseable, to_expr_kind};
22

33
use super::{Expression, Identifier};
44

@@ -7,7 +7,7 @@ to_expr_kind!(FunctionCall);
77

88
parseable! {
99
FunctionCall = |parser| {
10-
let expr = parser.expr_primary()?;
10+
let expr = ok_or_none!(Identifier::);
1111

1212
let ExpressionKind::Identifier(identifier) = &expr.value else {
1313
return Ok(None);
Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::{to_expr_kind, ast, parseable};
1+
use crate::{ast, ok_or_none, parseable, to_expr_kind};
22

33
use super::Expression;
44

@@ -7,12 +7,10 @@ to_expr_kind!(Group);
77

88
parseable! {
99
Group = |parser| {
10-
let mut expr = parser.expression()?;
10+
let expr = ok_or_none!(parser.expression()?);
1111

1212
parser.expect_token(&LexerTokenKind::RParen)?;
1313

14-
expr.value = ExpressionKind::Group(expr.value);
15-
16-
Ok(expr)
14+
Ok(Some(Group(expr)))
1715
}
1816
}

0 commit comments

Comments
 (0)