Compare commits
12 Commits
12e4d213f6
...
b6ae8b8a1f
Author | SHA1 | Date | |
---|---|---|---|
![]() |
b6ae8b8a1f | ||
21f3e497e8 | |||
1e390e0f44 | |||
4a73dc87f7 | |||
![]() |
90e9d4cb3b | ||
![]() |
4960ea3fb7 | ||
![]() |
af11f5ff1e | ||
![]() |
f5b3f2b090 | ||
![]() |
e82f4ee236 | ||
![]() |
250354e7c6 | ||
![]() |
9dacf76e68 | ||
![]() |
61673565cb |
@ -1,6 +1,10 @@
|
|||||||
# Change Log
|
# Change Log
|
||||||
|
|
||||||
## [Unreleased](https://github.com/dalance/sv-parser/compare/v0.13.2...Unreleased) - ReleaseDate
|
## [Unreleased](https://github.com/dalance/sv-parser/compare/v0.13.3...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
|
||||||
|
|
||||||
|
@ -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.2"
|
sv-parser = "0.13.3"
|
||||||
```
|
```
|
||||||
|
|
||||||
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).
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "sv-parser-error"
|
name = "sv-parser-error"
|
||||||
version = "0.13.2"
|
version = "0.13.3"
|
||||||
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"]
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use thiserror::Error;
|
use thiserror::Error;
|
||||||
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
#[derive(Error, Debug)]
|
#[derive(Error, Debug)]
|
||||||
@ -30,14 +31,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(String),
|
DefineArgNotFound(Option<(String, usize, usize)>),
|
||||||
|
|
||||||
#[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(String), // String is the macro identifier.
|
DefineNoArgs(Option<(String, usize, usize)>), // String is the macro identifier.
|
||||||
|
|
||||||
#[error("Exceed recursive limit")]
|
#[error("Exceed recursive limit")]
|
||||||
ExceedRecursiveLimit,
|
ExceedRecursiveLimit,
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "sv-parser-macros"
|
name = "sv-parser-macros"
|
||||||
version = "0.13.2"
|
version = "0.13.3"
|
||||||
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"]
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "sv-parser-parser"
|
name = "sv-parser-parser"
|
||||||
version = "0.13.2"
|
version = "0.13.3"
|
||||||
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.2", path = "../sv-parser-macros"}
|
sv-parser-macros = {version = "^0.13.3", path = "../sv-parser-macros"}
|
||||||
sv-parser-syntaxtree = {version = "^0.13.2", path = "../sv-parser-syntaxtree"}
|
sv-parser-syntaxtree = {version = "^0.13.3", path = "../sv-parser-syntaxtree"}
|
||||||
|
@ -150,8 +150,20 @@ 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) };
|
||||||
|
|
||||||
Ok((s, MethodCall { nodes: (a, b, c) }))
|
// check for chained method
|
||||||
|
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]
|
||||||
|
@ -14,8 +14,11 @@ 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) }))
|
||||||
}
|
}
|
||||||
|
@ -45,6 +45,13 @@ 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((_, _)));
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "sv-parser-pp"
|
name = "sv-parser-pp"
|
||||||
version = "0.13.2"
|
version = "0.13.3"
|
||||||
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.2", path = "../sv-parser-error"}
|
sv-parser-error = {version = "^0.13.3", path = "../sv-parser-error"}
|
||||||
sv-parser-parser = {version = "^0.13.2", path = "../sv-parser-parser"}
|
sv-parser-parser = {version = "^0.13.3", path = "../sv-parser-parser"}
|
||||||
sv-parser-syntaxtree = {version = "^0.13.2", path = "../sv-parser-syntaxtree"}
|
sv-parser-syntaxtree = {version = "^0.13.3", path = "../sv-parser-syntaxtree"}
|
||||||
|
@ -256,6 +256,9 @@ 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),
|
||||||
@ -445,7 +448,20 @@ 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 的唯一性
|
||||||
|
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);
|
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);
|
||||||
@ -598,8 +614,21 @@ pub fn preprocess_str<T: AsRef<Path>, U: AsRef<Path>, V: BuildHasher>(
|
|||||||
text: define_text,
|
text: define_text,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 确保填充 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));
|
defines.insert(id, Some(define));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Keep TextMacroDefinition after preprocess_inner().
|
// Keep TextMacroDefinition after preprocess_inner().
|
||||||
let locate: Locate = x.try_into().unwrap();
|
let locate: Locate = x.try_into().unwrap();
|
||||||
@ -697,6 +726,7 @@ 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)) => {
|
||||||
@ -714,6 +744,7 @@ 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
|
||||||
@ -795,6 +826,23 @@ 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 {
|
||||||
@ -945,7 +993,14 @@ 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 {
|
||||||
return Err(Error::DefineNoArgs(define.identifier.clone()));
|
let locate = get_locate(sv_parser_syntaxtree::RefNode::TextMacroIdentifier(name));
|
||||||
|
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() {
|
||||||
@ -962,7 +1017,16 @@ 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));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "sv-parser-syntaxtree"
|
name = "sv-parser-syntaxtree"
|
||||||
version = "0.13.2"
|
version = "0.13.3"
|
||||||
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.2", path = "../sv-parser-macros"}
|
sv-parser-macros = {version = "^0.13.3", path = "../sv-parser-macros"}
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
regex = "1"
|
regex = "1"
|
||||||
|
@ -56,3 +56,18 @@ 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),
|
||||||
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "sv-parser"
|
name = "sv-parser"
|
||||||
version = "0.13.2"
|
version = "0.13.3"
|
||||||
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.2", path = "../sv-parser-error"}
|
sv-parser-error = {version = "^0.13.3", path = "../sv-parser-error"}
|
||||||
sv-parser-parser = {version = "^0.13.2", path = "../sv-parser-parser"}
|
sv-parser-parser = {version = "^0.13.3", path = "../sv-parser-parser"}
|
||||||
sv-parser-pp = {version = "^0.13.2", path = "../sv-parser-pp"}
|
sv-parser-pp = {version = "^0.13.3", path = "../sv-parser-pp"}
|
||||||
sv-parser-syntaxtree = {version = "^0.13.2", path = "../sv-parser-syntaxtree"}
|
sv-parser-syntaxtree = {version = "^0.13.3", path = "../sv-parser-syntaxtree"}
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
structopt = "0.3.2"
|
structopt = "0.3.2"
|
||||||
|
@ -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");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,10 +12,11 @@ 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,
|
||||||
text: PreprocessedText,
|
pub text: PreprocessedText,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SyntaxTree {
|
impl SyntaxTree {
|
||||||
@ -209,6 +210,8 @@ 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 {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user