Finish porting over parsing rules
This commit is contained in:
parent
5af42d0828
commit
c5f7616303
@ -340,7 +340,10 @@ peg::parser! {
|
|||||||
|
|
||||||
//TODO improve the definition of identifiers
|
//TODO improve the definition of identifiers
|
||||||
rule identifier() -> &'input str =
|
rule identifier() -> &'input str =
|
||||||
$(['a'..='z' | 'A'..='Z' | '_'] ['a'..='z' | 'A'..='Z' | '0'..='9' | '_']*)
|
!reserved() text:$(['a'..='z' | 'A'..='Z' | '_'] ['a'..='z' | 'A'..='Z' | '0'..='9' | '_']*) { text }
|
||||||
|
|
||||||
|
//TODO flesh out more
|
||||||
|
rule reserved() = "module" / "if" / "then"
|
||||||
|
|
||||||
|
|
||||||
rule if_expr() -> ExpressionKind =
|
rule if_expr() -> ExpressionKind =
|
||||||
|
@ -6,7 +6,7 @@ use std::{fmt::Write, rc::Rc};
|
|||||||
|
|
||||||
use pretty_assertions::assert_eq;
|
use pretty_assertions::assert_eq;
|
||||||
|
|
||||||
use super::{new::schala_parser, tokenize, ParseResult, Parser};
|
use super::new::schala_parser;
|
||||||
use crate::{ast::*, tokenizing::Location};
|
use crate::{ast::*, tokenizing::Location};
|
||||||
|
|
||||||
fn rc(s: &str) -> Rc<String> {
|
fn rc(s: &str) -> Rc<String> {
|
||||||
@ -17,18 +17,6 @@ fn bx<T>(item: T) -> Box<T> {
|
|||||||
Box::new(item)
|
Box::new(item)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn make_parser(input: &str) -> Parser {
|
|
||||||
let tokens: Vec<crate::tokenizing::Token> = tokenize(input);
|
|
||||||
let mut parser = super::Parser::new();
|
|
||||||
parser.add_new_tokens(tokens);
|
|
||||||
parser
|
|
||||||
}
|
|
||||||
|
|
||||||
fn parse(input: &str) -> ParseResult<AST> {
|
|
||||||
let mut parser = make_parser(input);
|
|
||||||
parser.parse()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn stmt(kind: StatementKind) -> Statement {
|
fn stmt(kind: StatementKind) -> Statement {
|
||||||
Statement { location: Location::default(), id: ItemId::default(), kind }
|
Statement { location: Location::default(), id: ItemId::default(), kind }
|
||||||
}
|
}
|
||||||
@ -97,16 +85,6 @@ fn ty_simple(name: &str) -> TypeIdentifier {
|
|||||||
TypeIdentifier::Singleton(TypeSingletonName { name: rc(name), params: vec![] })
|
TypeIdentifier::Singleton(TypeSingletonName { name: rc(name), params: vec![] })
|
||||||
}
|
}
|
||||||
|
|
||||||
macro_rules! assert_ast {
|
|
||||||
($input:expr, $statements:expr) => {
|
|
||||||
let ast = parse($input).unwrap();
|
|
||||||
let expected = AST { id: Default::default(), statements: $statements.into() };
|
|
||||||
println!("Expected: {}", expected);
|
|
||||||
println!("Actual: {}", ast);
|
|
||||||
assert_eq!(ast, expected);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
macro_rules! assert_ast2 {
|
macro_rules! assert_ast2 {
|
||||||
($input:expr, $statements:expr) => {
|
($input:expr, $statements:expr) => {
|
||||||
let ast = schala_parser::program($input);
|
let ast = schala_parser::program($input);
|
||||||
@ -119,13 +97,6 @@ macro_rules! assert_ast2 {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
macro_rules! assert_fail {
|
|
||||||
($input:expr, $failure:expr) => {
|
|
||||||
let err = parse($input).unwrap_err();
|
|
||||||
assert_eq!(err.msg, $failure);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
macro_rules! assert_fail2 {
|
macro_rules! assert_fail2 {
|
||||||
($input:expr, $failure:expr) => {
|
($input:expr, $failure:expr) => {
|
||||||
let err = schala_parser::program($input).unwrap_err();
|
let err = schala_parser::program($input).unwrap_err();
|
||||||
@ -532,7 +503,7 @@ fn complex_lambdas() {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn reserved_words() {
|
fn reserved_words() {
|
||||||
assert_fail!("module::item::call()", "Expected an identifier, got Colon");
|
assert_fail2!("module::item::call()", "error at 1:7: expected ['a' ..= 'z' | 'A' ..= 'Z' | '_']");
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@ -796,7 +767,7 @@ fn functions() {
|
|||||||
]
|
]
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
assert_fail!("a(b,,c)", "Expected a literal expression, got Comma");
|
assert_fail2!("a(b,,c)","error at 1:5: expected one of \"(\", \".\", \"0b\", \"0x\", \"[\", \"\\\"\", \"_\", \"false\", \"for\", \"if\", \"true\", \"while\", ['+' | '-' | '!'], ['0' ..= '9'], ['a' ..= 'z' | 'A' ..= 'Z' | '_'], r#\"\\\"#");
|
||||||
|
|
||||||
assert_ast2!(
|
assert_ast2!(
|
||||||
"fn a(b, c: Int): Int",
|
"fn a(b, c: Int): Int",
|
||||||
|
Loading…
Reference in New Issue
Block a user