fix vhdl parser err
This commit is contained in:
parent
96670359c5
commit
db0156e88f
@ -129,7 +129,7 @@ fn parse_tokens(tokens: Vec<Token>) -> Vec<Module> {
|
||||
(kind_str(tokens[end+1].kind) == "architecture" || get_value(&tokens[end+1]) == arch_name)) {
|
||||
end += 1;
|
||||
}
|
||||
let end_pos = if get_value(&tokens[end+1]) == arch_name {
|
||||
let end_pos = if end+1 < tokens.len() && get_value(&tokens[end+1]) == arch_name {
|
||||
// i = end + 2;
|
||||
tokens[end+2].pos.range.end
|
||||
} else if end + 3 < tokens.len() {
|
||||
@ -161,7 +161,7 @@ fn parse_tokens(tokens: Vec<Token>) -> Vec<Module> {
|
||||
}
|
||||
"configuration" => {
|
||||
i += 1;
|
||||
while !(kind_str(tokens[i].kind) == "end" && kind_str(tokens[i+1].kind) == "configuration") {
|
||||
while i < tokens.len() && !(kind_str(tokens[i].kind) == "end" && kind_str(tokens[i+1].kind) == "configuration") {
|
||||
i += 1;
|
||||
}
|
||||
i += 1;
|
||||
@ -169,7 +169,7 @@ fn parse_tokens(tokens: Vec<Token>) -> Vec<Module> {
|
||||
"package" => {
|
||||
i += 1;
|
||||
// println!("get package");
|
||||
while !(kind_str(tokens[i].kind) == "end" && kind_str(tokens[i+1].kind) == "package") {
|
||||
while i < tokens.len() && !(kind_str(tokens[i].kind) == "end" && kind_str(tokens[i+1].kind) == "package") {
|
||||
i += 1;
|
||||
}
|
||||
i += 1;
|
||||
@ -178,11 +178,23 @@ fn parse_tokens(tokens: Vec<Token>) -> Vec<Module> {
|
||||
i += 1;
|
||||
instance_type.insert(get_value(&tokens[i]));
|
||||
// println!("instance {:?}", kind_str(tokens[i].kind));
|
||||
while !(kind_str(tokens[i].kind) == "end" && kind_str(tokens[i+1].kind) == "component") {
|
||||
while i < tokens.len() && !(kind_str(tokens[i].kind) == "end" && kind_str(tokens[i+1].kind) == "component") {
|
||||
i += 1;
|
||||
}
|
||||
i += 1;
|
||||
}
|
||||
"signal" => {
|
||||
i += 1;
|
||||
while !(kind_str(tokens[i+1].kind) == ";") {
|
||||
i += 1;
|
||||
}
|
||||
}
|
||||
"attribute" => {
|
||||
i += 1;
|
||||
while !(kind_str(tokens[i+1].kind) == ";") {
|
||||
i += 1;
|
||||
}
|
||||
}
|
||||
":" => {
|
||||
if (i+2 < tokens.len()) && (kind_str(tokens[i+2].kind) != "use") {
|
||||
if instance_type.contains(&get_value(&tokens[i+1])) {
|
||||
@ -222,6 +234,34 @@ fn parse_tokens(tokens: Vec<Token>) -> Vec<Module> {
|
||||
};
|
||||
modules.last_mut().unwrap().instances.push(instance);
|
||||
i += 1;
|
||||
} else {
|
||||
let name = get_value(&tokens[i-1]);
|
||||
let mut inst_type = String::new();
|
||||
while i < tokens.len() {
|
||||
if kind_str(tokens[i].kind) == "generic" || kind_str(tokens[i].kind) == "port" || kind_str(tokens[i].kind) == "end" {
|
||||
i = i - 1;
|
||||
break;
|
||||
}
|
||||
inst_type = inst_type + &get_value(&tokens[i]);
|
||||
i += 1;
|
||||
}
|
||||
let instance = Instance {
|
||||
name,
|
||||
inst_type,
|
||||
instports: None,
|
||||
instparams: None,
|
||||
range: Range {
|
||||
start: Position {
|
||||
line: tokens[i-1].pos.range.start.line + 1,
|
||||
character: tokens[i-1].pos.range.start.character + 1
|
||||
},
|
||||
end: Position {
|
||||
line: tokens[i+1].pos.range.start.line + 1,
|
||||
character: tokens[i+1].pos.range.start.character + 1
|
||||
}
|
||||
}
|
||||
};
|
||||
modules.last_mut().unwrap().instances.push(instance);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user