Split parser.rs into two files
This commit is contained in:
parent
9daefab1e0
commit
c9dffa7713
@ -1,10 +1,10 @@
|
|||||||
use super::errors::CompilerError;
|
mod parsed_reid;
|
||||||
|
|
||||||
|
use super::errors::CompilerError;
|
||||||
|
use parsed_reid::{Expression, ParsedReid};
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
use std::fmt::Display;
|
use std::fmt::Display;
|
||||||
|
|
||||||
type Ident = String;
|
|
||||||
|
|
||||||
const ALLOWED_IDENT_CHARS: [char; 38] = [
|
const ALLOWED_IDENT_CHARS: [char; 38] = [
|
||||||
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's',
|
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's',
|
||||||
't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '_', '-',
|
't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '_', '-',
|
||||||
@ -195,106 +195,6 @@ impl Parser {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
|
||||||
pub struct ParsedReid(Expression);
|
|
||||||
|
|
||||||
#[derive(Debug)]
|
|
||||||
pub enum Expression {
|
|
||||||
BlockExpr(Position, Vec<Expression>),
|
|
||||||
StatementExpr(Position, Statement),
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Expression {
|
|
||||||
pub fn parse(parser: &mut Parser) -> Result<Expression, CompilerError> {
|
|
||||||
let begin_pos = parser.pos();
|
|
||||||
|
|
||||||
let expect = parser.expect("{");
|
|
||||||
if let Some(_) = expect.get() {
|
|
||||||
let mut exp_list = Vec::new();
|
|
||||||
while {
|
|
||||||
match Expression::parse(parser) {
|
|
||||||
Ok(exp) => {
|
|
||||||
exp_list.push(exp);
|
|
||||||
true
|
|
||||||
}
|
|
||||||
Err(_) => false,
|
|
||||||
}
|
|
||||||
} {}
|
|
||||||
if let Some(_) = parser.expect("}").get() {
|
|
||||||
Ok(Expression::BlockExpr(begin_pos, exp_list))
|
|
||||||
} else {
|
|
||||||
Err(CompilerError::ExpectedToken(parser.pos(), '}'))
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
match Statement::parse(parser) {
|
|
||||||
Ok(statement) => Ok(Expression::StatementExpr(begin_pos, statement)),
|
|
||||||
Err(err) => Err(CompilerError::ExpectedExpression(begin_pos, Box::new(err))),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug)]
|
|
||||||
pub enum Statement {
|
|
||||||
LetStatement(Position, Ident, Box<Expression>),
|
|
||||||
ValueRef(Position, Pattern),
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Statement {
|
|
||||||
pub fn parse(parser: &mut Parser) -> Result<Statement, CompilerError> {
|
|
||||||
let pos = parser.pos();
|
|
||||||
|
|
||||||
if let Some(_) = parser.expect("let").get() {
|
|
||||||
let ident = parser
|
|
||||||
.expect_ident()
|
|
||||||
.get_or(CompilerError::ExpectedIdent(pos))?;
|
|
||||||
parser
|
|
||||||
.expect("=")
|
|
||||||
.get_or(CompilerError::ExpectedToken(pos, '='))?;
|
|
||||||
match Expression::parse(parser) {
|
|
||||||
Ok(expr) => {
|
|
||||||
parser
|
|
||||||
.expect(";")
|
|
||||||
.get_or(CompilerError::ExpectedToken(pos, ';'))?;
|
|
||||||
Ok(Statement::LetStatement(pos, ident, Box::new(expr)))
|
|
||||||
}
|
|
||||||
Err(err) => Err(CompilerError::ExpectedExpression(pos, Box::new(err))),
|
|
||||||
}
|
|
||||||
} else if let Ok(pattern) = Pattern::parse(parser) {
|
|
||||||
Ok(Statement::ValueRef(pos, pattern))
|
|
||||||
} else {
|
|
||||||
Err(CompilerError::ExpectedStatement(pos))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug)]
|
|
||||||
pub enum Pattern {
|
|
||||||
IdentPattern(Position, Ident),
|
|
||||||
LiteralPattern(Position, LiteralPattern),
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Pattern {
|
|
||||||
fn parse(parser: &mut Parser) -> Result<Pattern, CompilerError> {
|
|
||||||
let pos = parser.pos();
|
|
||||||
if let Some(string) = parser.expect_string_lit().get() {
|
|
||||||
Ok(Pattern::LiteralPattern(
|
|
||||||
pos,
|
|
||||||
LiteralPattern::StringLit(string),
|
|
||||||
))
|
|
||||||
} else if let Some(ident) = parser.expect_ident().get() {
|
|
||||||
Ok(Pattern::IdentPattern(pos, ident))
|
|
||||||
} else {
|
|
||||||
Err(CompilerError::ExpectedPattern(pos))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug)]
|
|
||||||
pub enum LiteralPattern {
|
|
||||||
StringLit(String),
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct Expect<'a> {
|
pub struct Expect<'a> {
|
||||||
text: Option<String>,
|
text: Option<String>,
|
||||||
len: usize,
|
len: usize,
|
103
src/parser/parsed_reid.rs
Normal file
103
src/parser/parsed_reid.rs
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
use super::{CompilerError, Parser, Position};
|
||||||
|
|
||||||
|
type Ident = String;
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct ParsedReid(pub Expression);
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub enum Expression {
|
||||||
|
BlockExpr(Position, Vec<Expression>),
|
||||||
|
StatementExpr(Position, Statement),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Expression {
|
||||||
|
pub fn parse(parser: &mut Parser) -> Result<Expression, CompilerError> {
|
||||||
|
let begin_pos = parser.pos();
|
||||||
|
|
||||||
|
let expect = parser.expect("{");
|
||||||
|
if let Some(_) = expect.get() {
|
||||||
|
let mut exp_list = Vec::new();
|
||||||
|
while {
|
||||||
|
match Expression::parse(parser) {
|
||||||
|
Ok(exp) => {
|
||||||
|
exp_list.push(exp);
|
||||||
|
true
|
||||||
|
}
|
||||||
|
Err(_) => false,
|
||||||
|
}
|
||||||
|
} {}
|
||||||
|
if let Some(_) = parser.expect("}").get() {
|
||||||
|
Ok(Expression::BlockExpr(begin_pos, exp_list))
|
||||||
|
} else {
|
||||||
|
Err(CompilerError::ExpectedToken(parser.pos(), '}'))
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
match Statement::parse(parser) {
|
||||||
|
Ok(statement) => Ok(Expression::StatementExpr(begin_pos, statement)),
|
||||||
|
Err(err) => Err(CompilerError::ExpectedExpression(begin_pos, Box::new(err))),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub enum Statement {
|
||||||
|
LetStatement(Position, Ident, Box<Expression>),
|
||||||
|
ValueRef(Position, Pattern),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Statement {
|
||||||
|
pub fn parse(parser: &mut Parser) -> Result<Statement, CompilerError> {
|
||||||
|
let pos = parser.pos();
|
||||||
|
|
||||||
|
if let Some(_) = parser.expect("let").get() {
|
||||||
|
let ident = parser
|
||||||
|
.expect_ident()
|
||||||
|
.get_or(CompilerError::ExpectedIdent(pos))?;
|
||||||
|
parser
|
||||||
|
.expect("=")
|
||||||
|
.get_or(CompilerError::ExpectedToken(pos, '='))?;
|
||||||
|
match Expression::parse(parser) {
|
||||||
|
Ok(expr) => {
|
||||||
|
parser
|
||||||
|
.expect(";")
|
||||||
|
.get_or(CompilerError::ExpectedToken(pos, ';'))?;
|
||||||
|
Ok(Statement::LetStatement(pos, ident, Box::new(expr)))
|
||||||
|
}
|
||||||
|
Err(err) => Err(CompilerError::ExpectedExpression(pos, Box::new(err))),
|
||||||
|
}
|
||||||
|
} else if let Ok(pattern) = Pattern::parse(parser) {
|
||||||
|
Ok(Statement::ValueRef(pos, pattern))
|
||||||
|
} else {
|
||||||
|
Err(CompilerError::ExpectedStatement(pos))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub enum Pattern {
|
||||||
|
IdentPattern(Position, Ident),
|
||||||
|
LiteralPattern(Position, LiteralPattern),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Pattern {
|
||||||
|
fn parse(parser: &mut Parser) -> Result<Pattern, CompilerError> {
|
||||||
|
let pos = parser.pos();
|
||||||
|
if let Some(string) = parser.expect_string_lit().get() {
|
||||||
|
Ok(Pattern::LiteralPattern(
|
||||||
|
pos,
|
||||||
|
LiteralPattern::StringLit(string),
|
||||||
|
))
|
||||||
|
} else if let Some(ident) = parser.expect_ident().get() {
|
||||||
|
Ok(Pattern::IdentPattern(pos, ident))
|
||||||
|
} else {
|
||||||
|
Err(CompilerError::ExpectedPattern(pos))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub enum LiteralPattern {
|
||||||
|
StringLit(String),
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user