Parser
This commit is contained in:
@@ -90,7 +90,7 @@ fn transpile_file(path *PathBuf, output_file *PathBuf, mod_decl *str) {
|
|||||||
|
|
||||||
let is_master = path.file_name().unwrap().to_str().unwrap() == "main.mist";
|
let is_master = path.file_name().unwrap().to_str().unwrap() == "main.mist";
|
||||||
|
|
||||||
let [[vis, api], ast] = match (mist_parser::parse(&source, is_master)) {
|
let [[vis, name], ast] = match (mist_parser::parse(&source, is_master)) {
|
||||||
Ok[ast] => ast;
|
Ok[ast] => ast;
|
||||||
Err[e] => {
|
Err[e] => {
|
||||||
match (e) {
|
match (e) {
|
||||||
|
|||||||
+17
-24
@@ -1,4 +1,4 @@
|
|||||||
use pest::{Parser, Span};
|
use pest::Parser;
|
||||||
use pest_derive::Parser;
|
use pest_derive::Parser;
|
||||||
|
|
||||||
pub mod ast;
|
pub mod ast;
|
||||||
@@ -16,8 +16,10 @@ pub struct MistParser;
|
|||||||
|
|
||||||
pub fn parse<'a>(
|
pub fn parse<'a>(
|
||||||
source: &'a str,
|
source: &'a str,
|
||||||
is_master: bool,
|
) -> Result<
|
||||||
) -> Result<((Visibility, Identifier), Vec<TopLevel>), ParseError<'a, Vec<TopLevel>>> {
|
(Option<(Visibility, Identifier)>, Vec<TopLevel>),
|
||||||
|
ParseError<'a, (Option<(Visibility, Identifier)>, Vec<TopLevel>)>,
|
||||||
|
> {
|
||||||
let mut pairs = MistParser::parse(Rule::program, source)?;
|
let mut pairs = MistParser::parse(Rule::program, source)?;
|
||||||
|
|
||||||
let mut statements = vec![];
|
let mut statements = vec![];
|
||||||
@@ -30,36 +32,27 @@ pub fn parse<'a>(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if is_master {
|
|
||||||
return match analyzer.build(statements) {
|
|
||||||
Ok(v) => Ok(((Visibility::Private, Identifier(String::new())), v)),
|
|
||||||
Err(e) => Err(ParseError::Ast(e)),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
let m = if let Some(v) = statements.get(0) {
|
let m = if let Some(v) = statements.get(0) {
|
||||||
if let TopLevelKind::DeclareModule(vis, name) = &v.0.item {
|
if let TopLevelKind::DeclareModule(vis, name) = &v.0.item {
|
||||||
(vis.clone(), name.clone())
|
Some((vis.clone(), name.clone()))
|
||||||
} else {
|
} else {
|
||||||
return Err(ParseError::Ast(error::AstError {
|
None
|
||||||
span: Span::new("", 0, 0).unwrap(),
|
|
||||||
error_code: error::ErrorCode::Module,
|
|
||||||
error_message: "Module must be declared, use `module <>;`".to_string(),
|
|
||||||
recovered: None,
|
|
||||||
}));
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return Err(ParseError::Ast(error::AstError {
|
None
|
||||||
span: Span::new("", 0, 0).unwrap(),
|
|
||||||
error_code: error::ErrorCode::Module,
|
|
||||||
error_message: "Module must be declared, use `module <>;`".to_string(),
|
|
||||||
recovered: None,
|
|
||||||
}));
|
|
||||||
};
|
};
|
||||||
|
|
||||||
match analyzer.build(statements) {
|
match analyzer.build(statements) {
|
||||||
Ok(v) => Ok((m, v)),
|
Ok(v) => Ok((m, v)),
|
||||||
Err(e) => Err(ParseError::Ast(e)),
|
Err(e) => {
|
||||||
|
let rec = e.recovered.clone().map(move |r| (m, r));
|
||||||
|
|
||||||
|
let mut e2 = e.get();
|
||||||
|
|
||||||
|
e2.recovered = rec;
|
||||||
|
|
||||||
|
Err(ParseError::Ast(e2))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user