diff --git a/CHANGELOG.md b/CHANGELOG.md index 9b570c3..ef76b19 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## [Unreleased](https://github.com/dalance/sv-parser/compare/v0.4.2...Unreleased) - ReleaseDate +* [Added] parse_sv_str/parse_lib_str + ## [v0.4.2](https://github.com/dalance/sv-parser/compare/v0.4.1...v0.4.2) - 2019-11-12 * [Added] re-export DefineText diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index 12efa79..c06a445 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -127,7 +127,7 @@ pub fn preprocess, U: AsRef>( preprocess_str(&s, path, pre_defines, include_paths) } -fn preprocess_str, U: AsRef>( +pub fn preprocess_str, U: AsRef>( s: &str, path: T, pre_defines: &Defines, diff --git a/sv-parser/src/lib.rs b/sv-parser/src/lib.rs index f1b7b4a..73da5fa 100644 --- a/sv-parser/src/lib.rs +++ b/sv-parser/src/lib.rs @@ -7,7 +7,9 @@ use std::fmt; use std::path::{Path, PathBuf}; pub use sv_parser_error::{Error, ErrorKind}; use sv_parser_parser::{lib_parser, sv_parser, Span, SpanInfo}; -pub use sv_parser_pp::preprocess::{preprocess, Define, DefineText, Defines, PreprocessedText}; +pub use sv_parser_pp::preprocess::{ + preprocess, preprocess_str, Define, DefineText, Defines, PreprocessedText, +}; pub use sv_parser_syntaxtree::*; pub struct SyntaxTree { @@ -122,6 +124,43 @@ pub fn parse_sv, U: AsRef>( } } +pub fn parse_sv_str, U: AsRef>( + s: &str, + path: T, + pre_defines: &HashMap>, + include_paths: &[U], +) -> Result<(SyntaxTree, Defines), Error> { + let (text, defines) = preprocess_str(s, path, pre_defines, include_paths)?; + let span = Span::new_extra(text.text(), SpanInfo::default()); + let result = all_consuming(sv_parser)(span); + match result { + Ok((_, x)) => Ok(( + SyntaxTree { + node: x.into(), + text, + }, + defines, + )), + Err(x) => { + let pos = match x { + nom::Err::Incomplete(_) => None, + nom::Err::Error(e) => error_position(&e), + nom::Err::Failure(e) => error_position(&e), + }; + let origin = if let Some(pos) = pos { + if let Some(origin) = text.origin(pos) { + Some((origin.0.clone(), origin.1)) + } else { + None + } + } else { + None + }; + Err(ErrorKind::Parse(origin).into()) + } + } +} + pub fn parse_lib, U: AsRef>( path: T, pre_defines: &HashMap>, @@ -158,6 +197,43 @@ pub fn parse_lib, U: AsRef>( } } +pub fn parse_lib_str, U: AsRef>( + s: &str, + path: T, + pre_defines: &HashMap>, + include_paths: &[U], +) -> Result<(SyntaxTree, Defines), Error> { + let (text, defines) = preprocess_str(s, path, pre_defines, include_paths)?; + let span = Span::new_extra(text.text(), SpanInfo::default()); + let result = all_consuming(lib_parser)(span); + match result { + Ok((_, x)) => Ok(( + SyntaxTree { + node: x.into(), + text, + }, + defines, + )), + Err(x) => { + let pos = match x { + nom::Err::Incomplete(_) => None, + nom::Err::Error(e) => error_position(&e), + nom::Err::Failure(e) => error_position(&e), + }; + let origin = if let Some(pos) = pos { + if let Some(origin) = text.origin(pos) { + Some((origin.0.clone(), origin.1)) + } else { + None + } + } else { + None + }; + Err(ErrorKind::Parse(origin).into()) + } + } +} + #[macro_export] macro_rules! unwrap_node { ($n:expr, $( $ty:tt ),+) => {{