Add support for parse tests

This commit is contained in:
toddlerer 2022-08-18 10:53:22 +09:00
parent 15e7f8c5ad
commit 88fc25978f
No known key found for this signature in database
GPG key ID: 44060B0ACE658F8D
3 changed files with 109 additions and 56 deletions

View file

@ -0,0 +1,63 @@
use erg_common::config::{ErgConfig, Input};
use erg_common::error::MultiErrorDisplay;
use erg_common::traits::Runnable;
use erg_parser::error::ParserRunnerErrors;
use erg_parser::lex::Lexer;
use erg_parser::ParserRunner;
#[test]
fn parse_dependent() -> Result<(), ParserRunnerErrors> {
parse_test_from_code("tests/dependent.er")
}
#[test]
fn parse_fib() -> Result<(), ParserRunnerErrors> {
parse_test_from_code("tests/fib.er")
}
#[test]
fn parse_hello_world() -> Result<(), ParserRunnerErrors> {
parse_test_from_code("tests/hello_world.er")
}
#[test]
fn parse_simple_if() -> Result<(), ParserRunnerErrors> {
parse_test_from_code("tests/simple_if.er")
}
#[test]
fn parse_stack() -> Result<(), ParserRunnerErrors> {
parse_test_from_code("tests/stack.er")
}
#[test]
fn parse_test1_basic_syntax() -> Result<(), ParserRunnerErrors> {
parse_test_from_code("tests/test1_basic_syntax.er")
}
#[test]
fn parse_test2_advanced_syntax() -> Result<(), ParserRunnerErrors> {
parse_test_from_code("tests/test2_advanced_syntax.er")
}
fn parse_test_from_code(file_path: &'static str) -> Result<(), ParserRunnerErrors> {
let input = Input::File(file_path.into());
let cfg = ErgConfig::new("exec", 1, false, None, 100, input.clone(), "<module>", 2);
let lexer = Lexer::new(input.clone());
let mut parser = ParserRunner::new(cfg);
match parser.parse_token_stream(
lexer
.lex()
.map_err(|errs| ParserRunnerErrors::convert(&input, errs))?,
) {
Ok(module) => {
println!("{module}");
Ok(())
}
Err(e) => {
e.fmt_all_stderr();
Err(e)
}
}
}

View file

@ -0,0 +1,20 @@
result = if Bool.sample():
0
1
print! result
if True, () -> log "hello"
if! False, () => print! "hello"
if! True:
() => print! "hello"
() => print! "world"
print! if False:
() -> "a"
() -> "b"
print!(if(True, () -> "a", () -> "b"))
# TODO: do/do!

View file

@ -1,25 +1,18 @@
extern crate erg_common; use std::iter::Iterator;
extern crate erg_parser;
mod tests { use erg_common::config::Input;
use std::iter::Iterator;
use erg_common::config::{ErgConfig, Input}; // use erg_compiler::parser;
use erg_common::error::MultiErrorDisplay;
use erg_common::traits::Runnable;
// use erg_compiler::parser; use erg_parser::error::ParseResult;
use erg_parser::lex::{Lexer};
use erg_parser::token::*;
use TokenKind::*;
use erg_parser::error::*; const FILE1: &str = "tests/test1_basic_syntax.er";
use erg_parser::lex::Lexer;
use erg_parser::token::*;
use erg_parser::ParserRunner;
use TokenKind::*;
const FILE1: &str = "src/compiler/parser/tests/test1_basic_syntax.er"; #[test]
fn test_lexer() -> ParseResult<()> {
#[test]
fn test_lexer() -> ParseResult<()> {
let mut lexer = Lexer::new(Input::File(FILE1.into())); let mut lexer = Lexer::new(Input::File(FILE1.into()));
let newline = "\n"; let newline = "\n";
let /*mut*/ token_array = vec![ let /*mut*/ token_array = vec![
@ -115,34 +108,11 @@ mod tests {
println!("{tok}"); println!("{tok}");
} }
Ok(()) Ok(())
} }
#[test] #[test]
fn tesop_te_prec() { fn tesop_te_prec() {
assert_eq!(Mod.precedence(), Some(160)); assert_eq!(Mod.precedence(), Some(160));
assert_eq!(LParen.precedence(), Some(0)); assert_eq!(LParen.precedence(), Some(0));
assert_eq!(Illegal.precedence(), None); assert_eq!(Illegal.precedence(), None);
}
#[test]
fn test_parser1() -> Result<(), ParserRunnerErrors> {
let input = Input::File(FILE1.into());
let cfg = ErgConfig::new("exec", 1, false, None, 100, input.clone(), "<module>", 2);
let lexer = Lexer::new(input.clone());
let mut parser = ParserRunner::new(cfg);
match parser.parse_token_stream(
lexer
.lex()
.map_err(|errs| ParserRunnerErrors::convert(&input, errs))?,
) {
Ok(module) => {
println!("{module}");
Ok(())
}
Err(e) => {
e.fmt_all_stderr();
Err(e)
}
}
}
} }