Decls
This commit is contained in:
parent
7a8ab3d571
commit
7f3b4a727f
@ -91,6 +91,8 @@ pub fn program(input: Span) -> ParseResult<AST> {
|
|||||||
)), |(_, items, _)| items.into())
|
)), |(_, items, _)| items.into())
|
||||||
)(input)?;
|
)(input)?;
|
||||||
|
|
||||||
|
println!("REST: {}", rest.fragment());
|
||||||
|
|
||||||
let ast = AST { id, statements };
|
let ast = AST { id, statements };
|
||||||
Ok((rest, ast))
|
Ok((rest, ast))
|
||||||
}
|
}
|
||||||
@ -118,8 +120,8 @@ fn statement(input: Span) -> ParseResult<Statement> {
|
|||||||
let (rest, kind) = context(
|
let (rest, kind) = context(
|
||||||
"Parsing-statement",
|
"Parsing-statement",
|
||||||
alt((
|
alt((
|
||||||
map(expression, StatementKind::Expression),
|
|
||||||
map(declaration, StatementKind::Declaration),
|
map(declaration, StatementKind::Declaration),
|
||||||
|
map(expression, StatementKind::Expression),
|
||||||
))
|
))
|
||||||
)(input)?;
|
)(input)?;
|
||||||
Ok((rest, Statement { id, location, kind }))
|
Ok((rest, Statement { id, location, kind }))
|
||||||
@ -144,25 +146,33 @@ fn module(input: Span) -> ParseResult<Declaration> {
|
|||||||
|
|
||||||
pub fn expression(input: Span) -> ParseResult<Expression> {
|
pub fn expression(input: Span) -> ParseResult<Expression> {
|
||||||
let id = fresh_id(&input);
|
let id = fresh_id(&input);
|
||||||
map(pair(expression_kind, opt(type_anno)), move |(kind, maybe_anno)| Expression::new(id, kind))(input)
|
map(pair(expression_kind, opt(type_anno)), move |(kind, type_anno)| Expression { id, type_anno, kind })(input)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn type_anno(input: Span) -> ParseResult<TypeIdentifier> {
|
fn type_anno(input: Span) -> ParseResult<TypeIdentifier> {
|
||||||
preceded(kw(":"), type_identifier)(input)
|
preceded(tok(char(':')), type_identifier)(input)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn type_identifier(input: Span) -> ParseResult<TypeIdentifier> {
|
fn type_identifier(input: Span) -> ParseResult<TypeIdentifier> {
|
||||||
/*
|
|
||||||
alt((
|
alt((
|
||||||
tuple((kw("("), separated_list0(kw(","), type_identifier), kw(")"))),
|
map(delimited(tok(char('(')), separated_list0(tok(char(',')), type_identifier), tok(char(')'))),
|
||||||
type_singleton_name
|
TypeIdentifier::Tuple),
|
||||||
|
map(type_singleton_name, TypeIdentifier::Singleton),
|
||||||
))(input)
|
))(input)
|
||||||
*/
|
|
||||||
unimplemented!()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn type_singleton_name(input: Span) -> ParseResult<TypeSingletonName> {
|
fn type_singleton_name(input: Span) -> ParseResult<TypeSingletonName> {
|
||||||
unimplemented!()
|
map(pair(tok(identifier), opt(type_params)), |(name, params)| TypeSingletonName {
|
||||||
|
name: rc_string(name.fragment()), params: if let Some(params) = params { params } else { vec![] }
|
||||||
|
})(input)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn type_params(input: Span) -> ParseResult<Vec<TypeIdentifier>> {
|
||||||
|
delimited(
|
||||||
|
tok(char('<')),
|
||||||
|
separated_list1(tok(char(',')), type_identifier),
|
||||||
|
tok(char('>'))
|
||||||
|
)(input)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn expression_kind(input: Span) -> ParseResult<ExpressionKind> {
|
pub fn expression_kind(input: Span) -> ParseResult<ExpressionKind> {
|
||||||
|
@ -44,7 +44,9 @@ impl Parser {
|
|||||||
let id_store: IdStore<ASTItem> = IdStore::new();
|
let id_store: IdStore<ASTItem> = IdStore::new();
|
||||||
let span = Span::new_extra(input, Rc::new(RefCell::new(id_store)));
|
let span = Span::new_extra(input, Rc::new(RefCell::new(id_store)));
|
||||||
|
|
||||||
combinator::expression(span).map_err(|err| convert_err(input, err)).map(|(_, output)| output)
|
combinator::expression(span).map_err(|err| convert_err(input, err)).map(|(rest, output)| {
|
||||||
|
output
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
@ -552,7 +552,7 @@ fn type_annotations() {
|
|||||||
use ExpressionKind::*;
|
use ExpressionKind::*;
|
||||||
use TypeIdentifier::*;
|
use TypeIdentifier::*;
|
||||||
|
|
||||||
assert_ast!(
|
assert_ast_comb!(
|
||||||
"let a = b : Int",
|
"let a = b : Int",
|
||||||
vec![decl(Declaration::Binding {
|
vec![decl(Declaration::Binding {
|
||||||
name: rc("a"),
|
name: rc("a"),
|
||||||
@ -562,11 +562,11 @@ fn type_annotations() {
|
|||||||
})]
|
})]
|
||||||
);
|
);
|
||||||
|
|
||||||
assert_expr!(
|
assert_expr_comb!(
|
||||||
"a: Int",
|
"a: Int",
|
||||||
expr_anno(Value(qn!(a)), Singleton(TypeSingletonName { name: rc("Int"), params: vec![] }))
|
expr_anno(Value(qn!(a)), Singleton(TypeSingletonName { name: rc("Int"), params: vec![] }))
|
||||||
);
|
);
|
||||||
assert_expr!(
|
assert_expr_comb!(
|
||||||
"a: Option<Int>",
|
"a: Option<Int>",
|
||||||
expr_anno(
|
expr_anno(
|
||||||
Value(qn!(a)),
|
Value(qn!(a)),
|
||||||
@ -576,7 +576,7 @@ fn type_annotations() {
|
|||||||
})
|
})
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
assert_expr!(
|
assert_expr_comb!(
|
||||||
"a: KoreanBBQSpecifier<Kimchi, Option<Bulgogi> >",
|
"a: KoreanBBQSpecifier<Kimchi, Option<Bulgogi> >",
|
||||||
expr_anno(
|
expr_anno(
|
||||||
Value(qn!(a)),
|
Value(qn!(a)),
|
||||||
@ -592,7 +592,7 @@ fn type_annotations() {
|
|||||||
})
|
})
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
assert_expr!(
|
assert_expr_comb!(
|
||||||
"a: (Int, Yolo<a>)",
|
"a: (Int, Yolo<a>)",
|
||||||
expr_anno(
|
expr_anno(
|
||||||
Value(qn!(a)),
|
Value(qn!(a)),
|
||||||
|
Loading…
Reference in New Issue
Block a user