Fix define with string literal
This commit is contained in:
parent
9c18f589ea
commit
ca7279225d
@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
## [Unreleased](https://github.com/dalance/sv-parser/compare/v0.3.3...Unreleased) - ReleaseDate
|
## [Unreleased](https://github.com/dalance/sv-parser/compare/v0.3.3...Unreleased) - ReleaseDate
|
||||||
|
|
||||||
|
* [Fixed] define with string literal
|
||||||
|
|
||||||
## [v0.3.3](https://github.com/dalance/sv-parser/compare/v0.3.2...v0.3.3) - 2019-11-01
|
## [v0.3.3](https://github.com/dalance/sv-parser/compare/v0.3.2...v0.3.3) - 2019-11-01
|
||||||
|
|
||||||
* [Fixed] define arument
|
* [Fixed] define arument
|
||||||
|
@ -478,6 +478,9 @@ pub(crate) fn else_group_of_lines(s: Span) -> IResult<Span, ElseGroupOfLines> {
|
|||||||
pub(crate) fn source_description(s: Span) -> IResult<Span, SourceDescription> {
|
pub(crate) fn source_description(s: Span) -> IResult<Span, SourceDescription> {
|
||||||
alt((
|
alt((
|
||||||
map(comment, |x| SourceDescription::Comment(Box::new(x))),
|
map(comment, |x| SourceDescription::Comment(Box::new(x))),
|
||||||
|
map(string_literal, |x| {
|
||||||
|
SourceDescription::StringLiteral(Box::new(x))
|
||||||
|
}),
|
||||||
source_description_not_directive,
|
source_description_not_directive,
|
||||||
map(compiler_directive, |x| {
|
map(compiler_directive, |x| {
|
||||||
SourceDescription::CompilerDirective(Box::new(x))
|
SourceDescription::CompilerDirective(Box::new(x))
|
||||||
@ -489,7 +492,7 @@ pub(crate) fn source_description(s: Span) -> IResult<Span, SourceDescription> {
|
|||||||
#[packrat_parser]
|
#[packrat_parser]
|
||||||
pub(crate) fn source_description_not_directive(s: Span) -> IResult<Span, SourceDescription> {
|
pub(crate) fn source_description_not_directive(s: Span) -> IResult<Span, SourceDescription> {
|
||||||
let (s, a) = many1(alt((
|
let (s, a) = many1(alt((
|
||||||
is_not("`/"),
|
is_not("`/\""),
|
||||||
terminated(tag("/"), peek(not(alt((tag("/"), tag("*")))))),
|
terminated(tag("/"), peek(not(alt((tag("/"), tag("*")))))),
|
||||||
)))(s)?;
|
)))(s)?;
|
||||||
|
|
||||||
|
@ -8,7 +8,9 @@ use std::io::{BufReader, Read};
|
|||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
use sv_parser_error::{Error, ErrorKind};
|
use sv_parser_error::{Error, ErrorKind};
|
||||||
use sv_parser_parser::{pp_parser, Span, SpanInfo};
|
use sv_parser_parser::{pp_parser, Span, SpanInfo};
|
||||||
use sv_parser_syntaxtree::{IncludeCompilerDirective, Locate, NodeEvent, RefNode, TextMacroUsage};
|
use sv_parser_syntaxtree::{
|
||||||
|
IncludeCompilerDirective, Locate, NodeEvent, RefNode, SourceDescription, TextMacroUsage,
|
||||||
|
};
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct PreprocessedText {
|
pub struct PreprocessedText {
|
||||||
@ -158,6 +160,13 @@ fn preprocess_str<T: AsRef<Path>, U: AsRef<Path>>(
|
|||||||
let range = Range::new(locate.offset, locate.offset + locate.len);
|
let range = Range::new(locate.offset, locate.offset + locate.len);
|
||||||
ret.push(locate.str(&s), path.as_ref(), range);
|
ret.push(locate.str(&s), path.as_ref(), range);
|
||||||
}
|
}
|
||||||
|
NodeEvent::Enter(RefNode::SourceDescription(SourceDescription::StringLiteral(x)))
|
||||||
|
if !skip =>
|
||||||
|
{
|
||||||
|
let locate: Locate = (&**x).try_into().unwrap();
|
||||||
|
let range = Range::new(locate.offset, locate.offset + locate.len);
|
||||||
|
ret.push(locate.str(&s), path.as_ref(), range);
|
||||||
|
}
|
||||||
NodeEvent::Enter(RefNode::KeywordsDirective(x)) if !skip => {
|
NodeEvent::Enter(RefNode::KeywordsDirective(x)) if !skip => {
|
||||||
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);
|
||||||
@ -340,7 +349,9 @@ fn identifier(node: RefNode, s: &str) -> Option<String> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn split_text(s: &str) -> Vec<String> {
|
fn split_text(s: &str) -> Vec<String> {
|
||||||
|
let mut is_string = false;
|
||||||
let mut is_ident = false;
|
let mut is_ident = false;
|
||||||
|
let mut is_backquote_prev = false;
|
||||||
let mut is_ident_prev;
|
let mut is_ident_prev;
|
||||||
let mut x = String::from("");
|
let mut x = String::from("");
|
||||||
let mut ret = vec![];
|
let mut ret = vec![];
|
||||||
@ -348,12 +359,31 @@ fn split_text(s: &str) -> Vec<String> {
|
|||||||
is_ident_prev = is_ident;
|
is_ident_prev = is_ident;
|
||||||
is_ident = c.is_ascii_alphanumeric() | (c == '_');
|
is_ident = c.is_ascii_alphanumeric() | (c == '_');
|
||||||
|
|
||||||
|
if c == '"' && is_backquote_prev {
|
||||||
|
x.push(c);
|
||||||
|
ret.push(x);
|
||||||
|
x = String::from("");
|
||||||
|
} else if c == '"' && !is_string {
|
||||||
|
ret.push(x);
|
||||||
|
x = String::from("");
|
||||||
|
x.push(c);
|
||||||
|
is_string = true;
|
||||||
|
} else if c == '"' && is_string {
|
||||||
|
x.push(c);
|
||||||
|
ret.push(x);
|
||||||
|
x = String::from("");
|
||||||
|
is_string = false;
|
||||||
|
} else if !is_string {
|
||||||
if is_ident != is_ident_prev {
|
if is_ident != is_ident_prev {
|
||||||
ret.push(x);
|
ret.push(x);
|
||||||
x = String::from("");
|
x = String::from("");
|
||||||
}
|
}
|
||||||
|
|
||||||
x.push(c);
|
x.push(c);
|
||||||
|
} else {
|
||||||
|
x.push(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
is_backquote_prev = c == '`';
|
||||||
}
|
}
|
||||||
ret.push(x);
|
ret.push(x);
|
||||||
ret
|
ret
|
||||||
@ -402,7 +432,13 @@ fn resolve_text_macro_usage<T: AsRef<Path>, U: AsRef<Path>>(
|
|||||||
if let Some(value) = arg_map.get(&text) {
|
if let Some(value) = arg_map.get(&text) {
|
||||||
replaced.push_str(*value);
|
replaced.push_str(*value);
|
||||||
} else {
|
} else {
|
||||||
replaced.push_str(&text.replace("``", "").replace("\\\n", ""));
|
replaced.push_str(
|
||||||
|
&text
|
||||||
|
.replace("``", "")
|
||||||
|
.replace("`\\`\"", "\\\"")
|
||||||
|
.replace("`\"", "\"")
|
||||||
|
.replace("\\\n", ""),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// separator is required
|
// separator is required
|
||||||
@ -538,6 +574,43 @@ module a ();
|
|||||||
always @(posedge clk) begin if (!(!(a[i].b && c[i]))) begin $display ("xxx(()[]]{}}}", a[i].b, c[i])
|
always @(posedge clk) begin if (!(!(a[i].b && c[i]))) begin $display ("xxx(()[]]{}}}", a[i].b, c[i])
|
||||||
; end end ;
|
; end end ;
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
"##
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test5() {
|
||||||
|
let (ret, _) =
|
||||||
|
preprocess(get_testcase("test5.sv"), &HashMap::new(), &[] as &[String]).unwrap();
|
||||||
|
assert_eq!(
|
||||||
|
ret.text(),
|
||||||
|
r##"module a;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
$display("`HI, world");
|
||||||
|
$display( "`HI, world" );
|
||||||
|
$display( "Hello, x" );
|
||||||
|
end
|
||||||
|
endmodule
|
||||||
|
"##
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test6() {
|
||||||
|
let (ret, _) =
|
||||||
|
preprocess(get_testcase("test6.sv"), &HashMap::new(), &[] as &[String]).unwrap();
|
||||||
|
assert_eq!(
|
||||||
|
ret.text(),
|
||||||
|
r##"
|
||||||
|
|
||||||
|
module a;
|
||||||
|
initial begin
|
||||||
|
$display( "left side: \"right side\"" );
|
||||||
|
end
|
||||||
endmodule
|
endmodule
|
||||||
"##
|
"##
|
||||||
);
|
);
|
||||||
|
10
sv-parser-pp/testcases/test5.sv
Normal file
10
sv-parser-pp/testcases/test5.sv
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
module a;
|
||||||
|
`define HI Hello
|
||||||
|
`define LO "`HI, world"
|
||||||
|
`define H(x) "Hello, x"
|
||||||
|
initial begin
|
||||||
|
$display("`HI, world");
|
||||||
|
$display(`LO);
|
||||||
|
$display(`H(world));
|
||||||
|
end
|
||||||
|
endmodule
|
7
sv-parser-pp/testcases/test6.sv
Normal file
7
sv-parser-pp/testcases/test6.sv
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
`define msg(x,y) `"x: `\`"y`\`"`"
|
||||||
|
|
||||||
|
module a;
|
||||||
|
initial begin
|
||||||
|
$display(`msg(left side,right side));
|
||||||
|
end
|
||||||
|
endmodule
|
@ -177,6 +177,7 @@ pub struct ElseGroupOfLines {
|
|||||||
#[derive(Clone, Debug, PartialEq, Node)]
|
#[derive(Clone, Debug, PartialEq, Node)]
|
||||||
pub enum SourceDescription {
|
pub enum SourceDescription {
|
||||||
Comment(Box<Comment>),
|
Comment(Box<Comment>),
|
||||||
|
StringLiteral(Box<StringLiteral>),
|
||||||
NotDirective(Box<SourceDescriptionNotDirective>),
|
NotDirective(Box<SourceDescriptionNotDirective>),
|
||||||
CompilerDirective(Box<CompilerDirective>),
|
CompilerDirective(Box<CompilerDirective>),
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,7 @@ use std::fmt;
|
|||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
pub use sv_parser_error::{Error, ErrorKind};
|
pub use sv_parser_error::{Error, ErrorKind};
|
||||||
use sv_parser_parser::{lib_parser, sv_parser, Span, SpanInfo};
|
use sv_parser_parser::{lib_parser, sv_parser, Span, SpanInfo};
|
||||||
use sv_parser_pp::preprocess::{preprocess, Define, Defines, PreprocessedText};
|
pub use sv_parser_pp::preprocess::{preprocess, Define, Defines, PreprocessedText};
|
||||||
pub use sv_parser_syntaxtree::*;
|
pub use sv_parser_syntaxtree::*;
|
||||||
|
|
||||||
pub struct SyntaxTree {
|
pub struct SyntaxTree {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user