Compare commits

..

No commits in common. "b6ae8b8a1ff22609e2a837b12dd798226f299f71" and "12e4d213f660cc67476e2f2750ed7a44cc0ff8a8" have entirely different histories.

17 changed files with 36 additions and 145 deletions

View File

@ -1,10 +1,6 @@
# Change Log # Change Log
## [Unreleased](https://github.com/dalance/sv-parser/compare/v0.13.3...Unreleased) - ReleaseDate ## [Unreleased](https://github.com/dalance/sv-parser/compare/v0.13.2...Unreleased) - ReleaseDate
## [v0.13.3](https://github.com/dalance/sv-parser/compare/v0.13.2...v0.13.3) - 2023-11-29
* [Fixed] Fix chained method [#93](https://github.com/dalance/sv-parser/pull/93)
## [v0.13.2](https://github.com/dalance/sv-parser/compare/v0.13.1...v0.13.2) - 2023-11-09 ## [v0.13.2](https://github.com/dalance/sv-parser/compare/v0.13.1...v0.13.2) - 2023-11-09

View File

@ -16,7 +16,7 @@ SystemVerilog parser library fully compliant with [IEEE 1800-2017](https://stand
```Cargo.toml ```Cargo.toml
[dependencies] [dependencies]
sv-parser = "0.13.3" sv-parser = "0.13.2"
``` ```
sv-parser provides [`parse_sv`](https://docs.rs/sv-parser/latest/sv_parser/fn.parse_sv.html) function which returns [`SyntaxTree`](https://docs.rs/sv-parser/latest/sv_parser/struct.SyntaxTree.html). sv-parser provides [`parse_sv`](https://docs.rs/sv-parser/latest/sv_parser/fn.parse_sv.html) function which returns [`SyntaxTree`](https://docs.rs/sv-parser/latest/sv_parser/struct.SyntaxTree.html).

View File

@ -1,6 +1,6 @@
[package] [package]
name = "sv-parser-error" name = "sv-parser-error"
version = "0.13.3" version = "0.13.2"
authors = ["dalance@gmail.com"] authors = ["dalance@gmail.com"]
repository = "https://github.com/dalance/sv-parser" repository = "https://github.com/dalance/sv-parser"
keywords = ["parser", "verilog", "systemverilog"] keywords = ["parser", "verilog", "systemverilog"]

View File

@ -1,7 +1,6 @@
use std::path::PathBuf; use std::path::PathBuf;
use thiserror::Error; use thiserror::Error;
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
#[derive(Error, Debug)] #[derive(Error, Debug)]
@ -31,14 +30,14 @@ pub enum Error {
#[error("Preprocess error: {0:?}")] #[error("Preprocess error: {0:?}")]
Preprocess(Option<(PathBuf, usize)>), Preprocess(Option<(PathBuf, usize)>),
#[error("Define argument not found: {0:?}")] #[error("Define argument not found: {0}")]
DefineArgNotFound(Option<(String, usize, usize)>), DefineArgNotFound(String),
#[error("Define not found: {0}")] #[error("Define not found: {0}")]
DefineNotFound(String), DefineNotFound(String),
#[error("Define must have argument")] #[error("Define must have argument")]
DefineNoArgs(Option<(String, usize, usize)>), // String is the macro identifier. DefineNoArgs(String), // String is the macro identifier.
#[error("Exceed recursive limit")] #[error("Exceed recursive limit")]
ExceedRecursiveLimit, ExceedRecursiveLimit,

View File

@ -1,6 +1,6 @@
[package] [package]
name = "sv-parser-macros" name = "sv-parser-macros"
version = "0.13.3" version = "0.13.2"
authors = ["dalance@gmail.com"] authors = ["dalance@gmail.com"]
repository = "https://github.com/dalance/sv-parser" repository = "https://github.com/dalance/sv-parser"
keywords = ["parser", "verilog", "systemverilog"] keywords = ["parser", "verilog", "systemverilog"]

View File

@ -1,6 +1,6 @@
[package] [package]
name = "sv-parser-parser" name = "sv-parser-parser"
version = "0.13.3" version = "0.13.2"
authors = ["dalance@gmail.com"] authors = ["dalance@gmail.com"]
repository = "https://github.com/dalance/sv-parser" repository = "https://github.com/dalance/sv-parser"
keywords = ["parser", "verilog", "systemverilog"] keywords = ["parser", "verilog", "systemverilog"]
@ -28,5 +28,5 @@ nom-packrat = "0.7"
nom-recursive = {version = "0.5", features = ["tracer128"]} nom-recursive = {version = "0.5", features = ["tracer128"]}
nom-tracable = "0.9" nom-tracable = "0.9"
str-concat = "0.2" str-concat = "0.2"
sv-parser-macros = {version = "^0.13.3", path = "../sv-parser-macros"} sv-parser-macros = {version = "^0.13.2", path = "../sv-parser-macros"}
sv-parser-syntaxtree = {version = "^0.13.3", path = "../sv-parser-syntaxtree"} sv-parser-syntaxtree = {version = "^0.13.2", path = "../sv-parser-syntaxtree"}

View File

@ -150,20 +150,8 @@ pub(crate) fn method_call(s: Span) -> IResult<Span, MethodCall> {
let (s, a) = method_call_root(s)?; let (s, a) = method_call_root(s)?;
let (s, b) = symbol(".")(s)?; let (s, b) = symbol(".")(s)?;
let (s, c) = method_call_body(s)?; let (s, c) = method_call_body(s)?;
let mut init_method_call = MethodCall { nodes: (a, b, c) };
// check for chained method Ok((s, MethodCall { nodes: (a, b, c) }))
let (s, sub_calls) = many0(pair(symbol("."), method_call_body))(s)?;
for (dot, body) in sub_calls {
let fun_sub_call = Primary::FunctionSubroutineCall(Box::new(FunctionSubroutineCall {
nodes: (SubroutineCall::MethodCall(Box::new(init_method_call)),),
}));
init_method_call = MethodCall {
nodes: (MethodCallRoot::Primary(Box::new(fun_sub_call)), dot, body),
};
}
Ok((s, init_method_call))
} }
#[tracable_parser] #[tracable_parser]

View File

@ -14,11 +14,8 @@ pub(crate) fn source_text(s: Span) -> IResult<Span, SourceText> {
#[tracable_parser] #[tracable_parser]
#[packrat_parser] #[packrat_parser]
pub(crate) fn source_text_incomplete(s: Span) -> IResult<Span, SourceText> { pub(crate) fn source_text_incomplete(s: Span) -> IResult<Span, SourceText> {
// 解析 white_space
let (s, a) = many0(white_space)(s)?; let (s, a) = many0(white_space)(s)?;
// 解析 timescale 信息
let (s, b) = opt(timeunits_declaration)(s)?; let (s, b) = opt(timeunits_declaration)(s)?;
// 解析模块信息
let (s, c) = many0(description)(s)?; let (s, c) = many0(description)(s)?;
Ok((s, SourceText { nodes: (a, b, c) })) Ok((s, SourceText { nodes: (a, b, c) }))
} }

View File

@ -45,13 +45,6 @@ macro_rules! error_test {
mod unit { mod unit {
use super::*; use super::*;
#[test]
fn test_chained_method_call() {
test!(method_call, "variable.method1().method2()", Ok((_, _)));
test!(method_call, "variable.member.method2()", Ok((_, _)));
test!(method_call, "variable.method1().member", Ok((_, _)));
}
#[test] #[test]
fn test_pulldown_strength() { fn test_pulldown_strength() {
test!(pulldown_strength, "(supply0, strong1)", Ok((_, _))); test!(pulldown_strength, "(supply0, strong1)", Ok((_, _)));

View File

@ -1,6 +1,6 @@
[package] [package]
name = "sv-parser-pp" name = "sv-parser-pp"
version = "0.13.3" version = "0.13.2"
authors = ["dalance@gmail.com"] authors = ["dalance@gmail.com"]
repository = "https://github.com/dalance/sv-parser" repository = "https://github.com/dalance/sv-parser"
keywords = ["parser", "verilog", "systemverilog"] keywords = ["parser", "verilog", "systemverilog"]
@ -23,6 +23,6 @@ trace = ["sv-parser-parser/trace"]
[dependencies] [dependencies]
nom = "7" nom = "7"
nom-greedyerror = "0.5" nom-greedyerror = "0.5"
sv-parser-error = {version = "^0.13.3", path = "../sv-parser-error"} sv-parser-error = {version = "^0.13.2", path = "../sv-parser-error"}
sv-parser-parser = {version = "^0.13.3", path = "../sv-parser-parser"} sv-parser-parser = {version = "^0.13.2", path = "../sv-parser-parser"}
sv-parser-syntaxtree = {version = "^0.13.3", path = "../sv-parser-syntaxtree"} sv-parser-syntaxtree = {version = "^0.13.2", path = "../sv-parser-syntaxtree"}

View File

@ -256,9 +256,6 @@ pub fn preprocess_str<T: AsRef<Path>, U: AsRef<Path>, V: BuildHasher>(
defines.insert(k.clone(), (*v).clone()); defines.insert(k.clone(), (*v).clone());
} }
// let contain_a = defines.contains_key("a");
// println!("defines contain a: {contain_a}");
let span = Span::new_extra(&s, SpanInfo::default()); let span = Span::new_extra(&s, SpanInfo::default());
let (_, pp_text) = all_consuming(pp_parser)(span).map_err(|x| match x { let (_, pp_text) = all_consuming(pp_parser)(span).map_err(|x| match x {
nom::Err::Incomplete(_) => Error::Preprocess(None), nom::Err::Incomplete(_) => Error::Preprocess(None),
@ -448,20 +445,7 @@ pub fn preprocess_str<T: AsRef<Path>, U: AsRef<Path>, V: BuildHasher>(
NodeEvent::Enter(RefNode::UndefineCompilerDirective(x)) => { NodeEvent::Enter(RefNode::UndefineCompilerDirective(x)) => {
let (_, _, ref name) = x.nodes; let (_, _, ref name) = x.nodes;
let id = identifier((&name.nodes.0).into(), &s).unwrap(); let id = identifier((&name.nodes.0).into(), &s).unwrap();
// 确保填充 define 的唯一性 defines.remove(&id);
let mut is_cover = false;
if let Some(define_text) = defines.get(&id) {
if let Some(define_text) = define_text {
if define_text.text.is_some() && define_text.text.clone().unwrap().text == "UNKNOWN_MACRO" {
is_cover = true;
}
}
}
if !is_cover {
defines.remove(&id);
}
// println!("remove id {id}");
let locate: Locate = x.try_into().unwrap(); let locate: Locate = x.try_into().unwrap();
let range = Range::new(locate.offset, locate.offset + locate.len); let range = Range::new(locate.offset, locate.offset + locate.len);
@ -614,20 +598,7 @@ pub fn preprocess_str<T: AsRef<Path>, U: AsRef<Path>, V: BuildHasher>(
text: define_text, text: define_text,
}; };
// 确保填充 define 的唯一性 defines.insert(id, Some(define));
let mut is_cover = false;
if let Some(define_text) = defines.get(&id) {
if let Some(define_text) = define_text {
if define_text.text.is_some() && define_text.text.clone().unwrap().text == "UNKNOWN_MACRO" {
// println!("enter dide");
is_cover = true;
}
}
}
if !is_cover {
defines.insert(id, Some(define));
}
} }
// Keep TextMacroDefinition after preprocess_inner(). // Keep TextMacroDefinition after preprocess_inner().
@ -726,7 +697,6 @@ pub fn preprocess_str<T: AsRef<Path>, U: AsRef<Path>, V: BuildHasher>(
}, },
)?; )?;
defines = new_defines; defines = new_defines;
// println!("[IncludeCompilerDirective] change defines, contain a : {}", defines.contains_key("a"));
ret.merge(include); ret.merge(include);
} }
NodeEvent::Enter(RefNode::TextMacroUsage(x)) => { NodeEvent::Enter(RefNode::TextMacroUsage(x)) => {
@ -744,7 +714,6 @@ pub fn preprocess_str<T: AsRef<Path>, U: AsRef<Path>, V: BuildHasher>(
)? { )? {
ret.push(&text, origin); ret.push(&text, origin);
defines = new_defines; defines = new_defines;
// println!("[TextMacroUsage] change defines, contain a : {}", defines.contains_key("a"));
} }
// Push the trailing whitespace attached to either // Push the trailing whitespace attached to either
@ -826,23 +795,6 @@ fn identifier(node: RefNode, s: &str) -> Option<String> {
None None
} }
fn get_locate(node: RefNode) -> Option<Locate> {
for x in node {
match x {
RefNode::SimpleIdentifier(x) => {
let x: Locate = x.nodes.0.try_into().unwrap();
return Some(x);
}
RefNode::EscapedIdentifier(x) => {
let x: Locate = x.nodes.0.try_into().unwrap();
return Some(x);
}
_ => (),
}
}
None
}
fn get_str(node: RefNode, s: &str) -> String { fn get_str(node: RefNode, s: &str) -> String {
let mut ret = String::from(""); let mut ret = String::from("");
for x in node { for x in node {
@ -993,14 +945,7 @@ fn resolve_text_macro_usage<T: AsRef<Path>, U: AsRef<Path>>(
let mut arg_map = HashMap::new(); let mut arg_map = HashMap::new();
if !define.arguments.is_empty() && no_args { if !define.arguments.is_empty() && no_args {
let locate = get_locate(sv_parser_syntaxtree::RefNode::TextMacroIdentifier(name)); return Err(Error::DefineNoArgs(define.identifier.clone()));
if let Some(locate) = locate {
let start_byte_idx = locate.offset;
let end_byte_idx = start_byte_idx + locate.len;
return Err(Error::DefineNoArgs(Some((define.identifier.clone(), start_byte_idx, end_byte_idx))))
} else {
return Err(Error::DefineNoArgs(None));
}
} }
for (i, (arg, default)) in define.arguments.iter().enumerate() { for (i, (arg, default)) in define.arguments.iter().enumerate() {
@ -1017,16 +962,7 @@ fn resolve_text_macro_usage<T: AsRef<Path>, U: AsRef<Path>>(
if let Some(default) = default { if let Some(default) = default {
default default
} else { } else {
// 找到对应出错的宏调用,再返回 return Err(Error::DefineArgNotFound(String::from(arg)));
let locate: Option<Locate> = get_locate(sv_parser_syntaxtree::RefNode::TextMacroIdentifier(name));
if let Some(locate) = locate {
let arg_name = arg.to_string();
let start_byte_idx = locate.offset;
let end_byte_idx = start_byte_idx + locate.len;
return Err(Error::DefineArgNotFound(Some((arg_name, start_byte_idx, end_byte_idx))));
} else {
return Err(Error::DefineArgNotFound(None));
}
} }
} }
}; };

View File

@ -1,6 +1,6 @@
[package] [package]
name = "sv-parser-syntaxtree" name = "sv-parser-syntaxtree"
version = "0.13.3" version = "0.13.2"
authors = ["dalance@gmail.com"] authors = ["dalance@gmail.com"]
repository = "https://github.com/dalance/sv-parser" repository = "https://github.com/dalance/sv-parser"
keywords = ["parser", "verilog", "systemverilog"] keywords = ["parser", "verilog", "systemverilog"]
@ -18,7 +18,7 @@ doctest = false
tag = false tag = false
[dependencies] [dependencies]
sv-parser-macros = {version = "^0.13.3", path = "../sv-parser-macros"} sv-parser-macros = {version = "^0.13.2", path = "../sv-parser-macros"}
[build-dependencies] [build-dependencies]
regex = "1" regex = "1"

View File

@ -56,18 +56,3 @@ impl<T, U> List<T, U> {
ret ret
} }
} }
#[derive(Clone, Debug, PartialEq, Node)]
pub enum NeedGetLocate {
ParamAssignments(ListOfParameterAssignments),
PortConnections(ListOfPortConnections),
GateInstantiation(GateInstantiation),
}
#[derive(Clone, Debug, PartialEq, Node)]
pub enum NeedParseExpression {
Port(PackedDimensionRange),
Parameter(ConstantMintypmaxExpression),
Expression(Expression),
NetValue(NetLvalue),
}

View File

@ -1,6 +1,6 @@
[package] [package]
name = "sv-parser" name = "sv-parser"
version = "0.13.3" version = "0.13.2"
authors = ["dalance@gmail.com"] authors = ["dalance@gmail.com"]
repository = "https://github.com/dalance/sv-parser" repository = "https://github.com/dalance/sv-parser"
keywords = ["parser", "verilog", "systemverilog"] keywords = ["parser", "verilog", "systemverilog"]
@ -28,10 +28,10 @@ trace = ["sv-parser-parser/trace"]
[dependencies] [dependencies]
nom = "7" nom = "7"
nom-greedyerror = "0.5" nom-greedyerror = "0.5"
sv-parser-error = {version = "^0.13.3", path = "../sv-parser-error"} sv-parser-error = {version = "^0.13.2", path = "../sv-parser-error"}
sv-parser-parser = {version = "^0.13.3", path = "../sv-parser-parser"} sv-parser-parser = {version = "^0.13.2", path = "../sv-parser-parser"}
sv-parser-pp = {version = "^0.13.3", path = "../sv-parser-pp"} sv-parser-pp = {version = "^0.13.2", path = "../sv-parser-pp"}
sv-parser-syntaxtree = {version = "^0.13.3", path = "../sv-parser-syntaxtree"} sv-parser-syntaxtree = {version = "^0.13.2", path = "../sv-parser-syntaxtree"}
[dev-dependencies] [dev-dependencies]
structopt = "0.3.2" structopt = "0.3.2"

View File

@ -29,19 +29,19 @@ fn main() {
// Original string can be got by SyntexTree::get_str(self, node: &RefNode) // Original string can be got by SyntexTree::get_str(self, node: &RefNode)
let id = syntax_tree.get_str(&id).unwrap(); let id = syntax_tree.get_str(&id).unwrap();
// println!("module: {}", id); println!("module: {}", id);
} }
RefNode::ModuleDeclarationAnsi(x) => { RefNode::ModuleDeclarationAnsi(x) => {
let id = unwrap_node!(x, ModuleIdentifier).unwrap(); let id = unwrap_node!(x, ModuleIdentifier).unwrap();
let id = get_identifier(id).unwrap(); let id = get_identifier(id).unwrap();
let id = syntax_tree.get_str(&id).unwrap(); let id = syntax_tree.get_str(&id).unwrap();
// println!("module: {}", id); println!("module: {}", id);
} }
_ => (), _ => (),
} }
} }
} else { } else {
// println!("Parse failed"); println!("Parse failed");
} }
} }

View File

@ -70,7 +70,7 @@ fn main() {
false, // ignore_include false, // ignore_include
) { ) {
Ok((preprocessed_text, new_defines)) => { Ok((preprocessed_text, new_defines)) => {
// println!("{}", preprocessed_text.text()); println!("{}", preprocessed_text.text());
defines = new_defines; defines = new_defines;
} }
_ => (), _ => (),
@ -79,24 +79,24 @@ fn main() {
match parse_sv(&path, &defines, &opt.includes, false, opt.incomplete) { match parse_sv(&path, &defines, &opt.includes, false, opt.incomplete) {
Ok((syntax_tree, new_defines)) => { Ok((syntax_tree, new_defines)) => {
if opt.tree { if opt.tree {
// println!("{}", syntax_tree); println!("{}", syntax_tree);
} }
defines = new_defines; defines = new_defines;
if !opt.quiet { if !opt.quiet {
// println!("parse succeeded: {:?}", path); println!("parse succeeded: {:?}", path);
} }
} }
Err(x) => { Err(x) => {
match x { match x {
Error::Parse(Some((origin_path, origin_pos))) => { Error::Parse(Some((origin_path, origin_pos))) => {
// println!("parse failed: {:?}", path); println!("parse failed: {:?}", path);
print_parse_error(&origin_path, &origin_pos); print_parse_error(&origin_path, &origin_pos);
} }
x => { x => {
// println!("parse failed: {:?} ({:?})", path, x); println!("parse failed: {:?} ({:?})", path, x);
let mut err = x.source(); let mut err = x.source();
while let Some(x) = err { while let Some(x) = err {
// println!(" Caused by {}", x); println!(" Caused by {}", x);
err = x.source(); err = x.source();
} }
} }

View File

@ -12,11 +12,10 @@ pub use sv_parser_pp::preprocess::{
preprocess, preprocess_str, Define, DefineText, Defines, PreprocessedText, preprocess, preprocess_str, Define, DefineText, Defines, PreprocessedText,
}; };
pub use sv_parser_syntaxtree::*; pub use sv_parser_syntaxtree::*;
pub use sv_parser_pp::range as sv_parser_pp_range;
pub struct SyntaxTree { pub struct SyntaxTree {
node: AnyNode, node: AnyNode,
pub text: PreprocessedText, text: PreprocessedText,
} }
impl SyntaxTree { impl SyntaxTree {
@ -210,8 +209,6 @@ pub fn parse_sv_pp(
} else { } else {
sv_parser(span) sv_parser(span)
}; };
// println!("result {result:?}");
match result { match result {
Ok((_, x)) => Ok(( Ok((_, x)) => Ok((
SyntaxTree { SyntaxTree {