cargo fmt
This commit is contained in:
parent
49c72e8930
commit
f26e24bba1
7 changed files with 596 additions and 538 deletions
src
203
src/parser.rs
203
src/parser.rs
|
@ -1,12 +1,12 @@
|
|||
use {
|
||||
crate::{
|
||||
expr::{LTExpr, Statement, TypeError, TypeTag},
|
||||
lexer::{LTIRLexer, LTIRToken, LexError},
|
||||
},
|
||||
std::{
|
||||
iter::Peekable,
|
||||
sync::{Arc, RwLock}
|
||||
sync::{Arc, RwLock},
|
||||
},
|
||||
crate::{
|
||||
lexer::{LTIRLexer, LTIRToken, LexError},
|
||||
expr::{LTExpr, Statement, TypeTag, TypeError}
|
||||
}
|
||||
};
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
|
@ -14,14 +14,15 @@ pub enum ParseError {
|
|||
LexError(LexError),
|
||||
UnexpectedClose,
|
||||
UnexpectedEnd,
|
||||
UnexpectedToken
|
||||
UnexpectedToken,
|
||||
}
|
||||
|
||||
pub fn parse_expect<It>(
|
||||
tokens: &mut Peekable<LTIRLexer<It>>,
|
||||
expected_token: LTIRToken
|
||||
) -> Result< (), ParseError >
|
||||
where It: Iterator<Item = char>
|
||||
expected_token: LTIRToken,
|
||||
) -> Result<(), ParseError>
|
||||
where
|
||||
It: Iterator<Item = char>,
|
||||
{
|
||||
match tokens.next() {
|
||||
Some(Ok(t)) => {
|
||||
|
@ -30,16 +31,15 @@ where It: Iterator<Item = char>
|
|||
} else {
|
||||
Err(ParseError::UnexpectedToken)
|
||||
}
|
||||
},
|
||||
}
|
||||
Some(Err(err)) => Err(ParseError::LexError(err)),
|
||||
None => Err(ParseError::UnexpectedEnd)
|
||||
None => Err(ParseError::UnexpectedEnd),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn parse_symbol<It>(
|
||||
tokens: &mut Peekable<LTIRLexer<It>>
|
||||
) -> Result< String, ParseError >
|
||||
where It: Iterator<Item = char>
|
||||
pub fn parse_symbol<It>(tokens: &mut Peekable<LTIRLexer<It>>) -> Result<String, ParseError>
|
||||
where
|
||||
It: Iterator<Item = char>,
|
||||
{
|
||||
match tokens.next() {
|
||||
Some(Ok(LTIRToken::Symbol(name))) => Ok(name),
|
||||
|
@ -51,24 +51,21 @@ where It: Iterator<Item = char>
|
|||
|
||||
pub fn parse_type_tag<It>(
|
||||
typectx: &Arc<RwLock<laddertypes::dict::TypeDict>>,
|
||||
tokens: &mut Peekable<LTIRLexer<It>>
|
||||
tokens: &mut Peekable<LTIRLexer<It>>,
|
||||
) -> Option<TypeTag>
|
||||
where It: Iterator<Item = char>
|
||||
where
|
||||
It: Iterator<Item = char>,
|
||||
{
|
||||
if let Some(peektok) = tokens.peek().clone() {
|
||||
match peektok.clone() {
|
||||
Ok(LTIRToken::AssignType(typeterm_str)) => {
|
||||
tokens.next();
|
||||
match typectx.write().unwrap().parse(typeterm_str.as_str()) {
|
||||
Ok(typeterm) => {
|
||||
Some(Ok(typeterm))
|
||||
}
|
||||
Err(parse_error) => {
|
||||
Some(Err(TypeError::ParseError(parse_error)))
|
||||
}
|
||||
Ok(typeterm) => Some(Ok(typeterm)),
|
||||
Err(parse_error) => Some(Err(TypeError::ParseError(parse_error))),
|
||||
}
|
||||
}
|
||||
_ => None
|
||||
_ => None,
|
||||
}
|
||||
} else {
|
||||
None
|
||||
|
@ -77,9 +74,10 @@ where It: Iterator<Item = char>
|
|||
|
||||
pub fn parse_statement<It>(
|
||||
typectx: &Arc<RwLock<laddertypes::dict::TypeDict>>,
|
||||
tokens: &mut Peekable<LTIRLexer<It>>
|
||||
) -> Result< crate::expr::Statement, ParseError >
|
||||
where It: Iterator<Item = char>
|
||||
tokens: &mut Peekable<LTIRLexer<It>>,
|
||||
) -> Result<crate::expr::Statement, ParseError>
|
||||
where
|
||||
It: Iterator<Item = char>,
|
||||
{
|
||||
if let Some(peektok) = tokens.peek() {
|
||||
match peektok {
|
||||
|
@ -94,7 +92,7 @@ where It: Iterator<Item = char>
|
|||
|
||||
Ok(Statement::Assignment {
|
||||
var_id: name,
|
||||
val_expr
|
||||
val_expr,
|
||||
})
|
||||
}
|
||||
"let" => {
|
||||
|
@ -104,11 +102,11 @@ where It: Iterator<Item = char>
|
|||
let _ = parse_expect(tokens, LTIRToken::AssignValue);
|
||||
let val_expr = parse_expr(typectx, tokens)?;
|
||||
let _ = parse_expect(tokens, LTIRToken::StatementSep)?;
|
||||
|
||||
|
||||
Ok(Statement::LetAssign {
|
||||
typ,
|
||||
var_id: name,
|
||||
val_expr
|
||||
val_expr,
|
||||
})
|
||||
}
|
||||
"while" => {
|
||||
|
@ -118,7 +116,7 @@ where It: Iterator<Item = char>
|
|||
let _ = parse_expect(tokens, LTIRToken::ExprClose)?;
|
||||
Ok(Statement::WhileLoop {
|
||||
condition: cond,
|
||||
body: parse_block(typectx, tokens)?
|
||||
body: parse_block(typectx, tokens)?,
|
||||
})
|
||||
}
|
||||
"return" => {
|
||||
|
@ -138,8 +136,8 @@ where It: Iterator<Item = char>
|
|||
let expr = parse_expr(typectx, tokens)?;
|
||||
let _ = parse_expect(tokens, LTIRToken::StatementSep)?;
|
||||
Ok(Statement::Expr(expr))
|
||||
},
|
||||
Err(err) => Err(ParseError::LexError(err.clone()))
|
||||
}
|
||||
Err(err) => Err(ParseError::LexError(err.clone())),
|
||||
}
|
||||
} else {
|
||||
Err(ParseError::UnexpectedEnd)
|
||||
|
@ -148,9 +146,10 @@ where It: Iterator<Item = char>
|
|||
|
||||
pub fn parse_block<It>(
|
||||
typectx: &Arc<RwLock<laddertypes::dict::TypeDict>>,
|
||||
tokens: &mut Peekable<LTIRLexer<It>>
|
||||
) -> Result< Vec<Statement>, ParseError >
|
||||
where It: Iterator<Item = char>
|
||||
tokens: &mut Peekable<LTIRLexer<It>>,
|
||||
) -> Result<Vec<Statement>, ParseError>
|
||||
where
|
||||
It: Iterator<Item = char>,
|
||||
{
|
||||
let _ = parse_expect(tokens, LTIRToken::BlockOpen)?;
|
||||
|
||||
|
@ -159,10 +158,14 @@ where It: Iterator<Item = char>
|
|||
match peektok {
|
||||
Ok(LTIRToken::BlockClose) => {
|
||||
tokens.next();
|
||||
return Ok(statements)
|
||||
return Ok(statements);
|
||||
}
|
||||
Ok(_) => {
|
||||
statements.push(parse_statement(typectx, tokens)?);
|
||||
}
|
||||
Err(err) => {
|
||||
return Err(ParseError::LexError(err.clone()));
|
||||
}
|
||||
Ok(_) => { statements.push( parse_statement(typectx, tokens)? ); }
|
||||
Err(err) => { return Err(ParseError::LexError(err.clone())); }
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -170,37 +173,27 @@ where It: Iterator<Item = char>
|
|||
}
|
||||
|
||||
pub fn parse_atom<It>(
|
||||
tokens: &mut Peekable<LTIRLexer<It>>
|
||||
) -> Result< crate::expr::LTExpr, ParseError >
|
||||
where It: Iterator<Item = char>
|
||||
tokens: &mut Peekable<LTIRLexer<It>>,
|
||||
) -> Result<crate::expr::LTExpr, ParseError>
|
||||
where
|
||||
It: Iterator<Item = char>,
|
||||
{
|
||||
match tokens.next() {
|
||||
Some(Ok(LTIRToken::Symbol(sym))) => {
|
||||
Ok(LTExpr::symbol(sym.as_str()))
|
||||
}
|
||||
Some(Ok(LTIRToken::Char(c))) => {
|
||||
Ok(LTExpr::lit_uint(c as u64))
|
||||
}
|
||||
Some(Ok(LTIRToken::Num(n))) => {
|
||||
Ok(LTExpr::lit_uint(n as u64))
|
||||
}
|
||||
Some(Ok(_)) => {
|
||||
Err(ParseError::UnexpectedToken)
|
||||
}
|
||||
Some(Err(err)) => {
|
||||
Err(ParseError::LexError(err))
|
||||
}
|
||||
None => {
|
||||
Err(ParseError::UnexpectedEnd)
|
||||
}
|
||||
Some(Ok(LTIRToken::Symbol(sym))) => Ok(LTExpr::symbol(sym.as_str())),
|
||||
Some(Ok(LTIRToken::Char(c))) => Ok(LTExpr::lit_uint(c as u64)),
|
||||
Some(Ok(LTIRToken::Num(n))) => Ok(LTExpr::lit_uint(n as u64)),
|
||||
Some(Ok(_)) => Err(ParseError::UnexpectedToken),
|
||||
Some(Err(err)) => Err(ParseError::LexError(err)),
|
||||
None => Err(ParseError::UnexpectedEnd),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn parse_expr<It>(
|
||||
typectx: &Arc<RwLock<laddertypes::dict::TypeDict>>,
|
||||
tokens: &mut Peekable<LTIRLexer<It>>
|
||||
) -> Result< crate::expr::LTExpr, ParseError >
|
||||
where It: Iterator<Item = char>
|
||||
tokens: &mut Peekable<LTIRLexer<It>>,
|
||||
) -> Result<crate::expr::LTExpr, ParseError>
|
||||
where
|
||||
It: Iterator<Item = char>,
|
||||
{
|
||||
let mut children = Vec::new();
|
||||
|
||||
|
@ -212,18 +205,15 @@ where It: Iterator<Item = char>
|
|||
|
||||
let mut args = Vec::new();
|
||||
while let Some(Ok(LTIRToken::Symbol(_))) = tokens.peek() {
|
||||
args.push((
|
||||
parse_symbol(tokens)?,
|
||||
parse_type_tag(typectx, tokens)
|
||||
));
|
||||
args.push((parse_symbol(tokens)?, parse_type_tag(typectx, tokens)));
|
||||
}
|
||||
|
||||
let _ = parse_expect(tokens, LTIRToken::LambdaBody);
|
||||
let body = parse_expr(typectx, tokens)?;
|
||||
|
||||
return Ok(LTExpr::Abstraction{
|
||||
return Ok(LTExpr::Abstraction {
|
||||
args,
|
||||
body: Box::new(body)
|
||||
body: Box::new(body),
|
||||
});
|
||||
} else {
|
||||
return Err(ParseError::UnexpectedToken);
|
||||
|
@ -241,45 +231,53 @@ where It: Iterator<Item = char>
|
|||
}
|
||||
children.push(parse_expr(typectx, tokens)?);
|
||||
}
|
||||
},
|
||||
Ok(LTIRToken::ExprClose) => { break; }
|
||||
Ok(LTIRToken::BlockOpen) => {
|
||||
children.push( LTExpr::block(parse_block(typectx, tokens)?));
|
||||
}
|
||||
Ok(LTIRToken::BlockClose) => { break; }
|
||||
Ok(LTIRToken::StatementSep) => { break; }
|
||||
Ok(LTIRToken::Symbol(name)) => {
|
||||
match name.as_str() {
|
||||
"if" => {
|
||||
tokens.next();
|
||||
let _ = parse_expect(tokens, LTIRToken::ExprOpen)?;
|
||||
let cond = parse_expr(typectx, tokens)?;
|
||||
let _ = parse_expect(tokens, LTIRToken::ExprClose)?;
|
||||
let if_expr = LTExpr::block(parse_block(typectx, tokens)?);
|
||||
let mut else_expr = LTExpr::block(vec![]);
|
||||
Ok(LTIRToken::ExprClose) => {
|
||||
break;
|
||||
}
|
||||
Ok(LTIRToken::BlockOpen) => {
|
||||
children.push(LTExpr::block(parse_block(typectx, tokens)?));
|
||||
}
|
||||
Ok(LTIRToken::BlockClose) => {
|
||||
break;
|
||||
}
|
||||
Ok(LTIRToken::StatementSep) => {
|
||||
break;
|
||||
}
|
||||
Ok(LTIRToken::Symbol(name)) => match name.as_str() {
|
||||
"if" => {
|
||||
tokens.next();
|
||||
let _ = parse_expect(tokens, LTIRToken::ExprOpen)?;
|
||||
let cond = parse_expr(typectx, tokens)?;
|
||||
let _ = parse_expect(tokens, LTIRToken::ExprClose)?;
|
||||
let if_expr = LTExpr::block(parse_block(typectx, tokens)?);
|
||||
let mut else_expr = LTExpr::block(vec![]);
|
||||
|
||||
if let Some(peektok) = tokens.peek() {
|
||||
if let Ok(LTIRToken::Symbol(name)) = peektok {
|
||||
if name == "else" {
|
||||
tokens.next();
|
||||
else_expr = parse_expr(typectx, tokens)?;
|
||||
}
|
||||
if let Some(peektok) = tokens.peek() {
|
||||
if let Ok(LTIRToken::Symbol(name)) = peektok {
|
||||
if name == "else" {
|
||||
tokens.next();
|
||||
else_expr = parse_expr(typectx, tokens)?;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
children.push(LTExpr::Branch{
|
||||
condition: Box::new(cond),
|
||||
if_expr: Box::new(if_expr),
|
||||
else_expr: Box::new(else_expr)
|
||||
});
|
||||
}
|
||||
name => {
|
||||
children.push(parse_atom(tokens)?);
|
||||
}
|
||||
children.push(LTExpr::Branch {
|
||||
condition: Box::new(cond),
|
||||
if_expr: Box::new(if_expr),
|
||||
else_expr: Box::new(else_expr),
|
||||
});
|
||||
}
|
||||
name => {
|
||||
children.push(parse_atom(tokens)?);
|
||||
}
|
||||
},
|
||||
Ok(atom) => {
|
||||
children.push(parse_atom(tokens)?);
|
||||
}
|
||||
Err(err) => {
|
||||
return Err(ParseError::LexError(err.clone()));
|
||||
}
|
||||
Ok(atom) => { children.push(parse_atom(tokens)?); }
|
||||
Err(err) => { return Err(ParseError::LexError(err.clone())); }
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -288,10 +286,9 @@ where It: Iterator<Item = char>
|
|||
Ok(LTExpr::Application {
|
||||
typ: None,
|
||||
head: Box::new(head),
|
||||
body: children
|
||||
body: children,
|
||||
})
|
||||
} else {
|
||||
Err(ParseError::UnexpectedEnd)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue