我有boolean
一个字符串形式的表达式,并想以某种方式拆分它。查看以下示例,我想要 3 个拆分in, out, sig
:
(in == 1'b1) | !out & (sig==1'b0)
可能RegEx
最适合拆分,但我将如何定义界限?也许我需要某种可用于跟踪文字标记何时开始或结束的字母表,例如:&|=()!~
但是我怎么能告诉in
和之间的所有内容out
,即== 1'b1) | !
,不应该被标记?
我有boolean
一个字符串形式的表达式,并想以某种方式拆分它。查看以下示例,我想要 3 个拆分in, out, sig
:
(in == 1'b1) | !out & (sig==1'b0)
可能RegEx
最适合拆分,但我将如何定义界限?也许我需要某种可用于跟踪文字标记何时开始或结束的字母表,例如:&|=()!~
但是我怎么能告诉in
和之间的所有内容out
,即== 1'b1) | !
,不应该被标记?
(in == 1'b1) | !out & (sig==1'b0)
我们有这个输入。并想找到所有变量。
我将使用Perl
语言进行算法,想想,写起来很简单。
首先,让我们尝试查找所有simple
表达式:
my $input = q((in == 1'b1) | !out & (sig==1'b0)); #string as input
my @expressions = split(/[|&]/,$input);
#after that split we have:
#1) (in == 1'b1)
#2) !out
#3) (sig==1'b0)
#next thing, I thought, would be searhing of (!) and equations:
for my $expression (@expressions){
$expression =~ s/^\s+//; #delete all spaces from beginning of string
$expression =~ s/\s+$//; #delete all spaces at end of string
$expression =~ s/^[\(](.+)[\)]$/$1/; #delete round brackets
#here you must check, if we have round brackets, some kind of iteration must be here
$expression =~ s/^!//; #find first (!), it can be here
my ($left, $right) = split(/!=|==/,$expression);
#ok, now check, if left or right operand a variable:
if($left eq "1'b1" or $left eq "1'b0"){
#not our variable
}
else{
#our variable, $left ;)
}
if ($right eq "1'b1" or $right eq "1'b0"){
#not our variable
}
else{
if(defined($right) and $right!=""){
#our variable $right
}
}
}
但是,正如我所见,你在这里有一些简单的东西。
所以,你想在这里找到所有变量。
/(?<!1|b|')[a-zA-Z_\d]+(?!(0|1|'))/