0

我有boolean一个字符串形式的表达式,并想以某种方式拆分它。查看以下示例,我想要 3 个拆分in, out, sig

(in == 1'b1) | !out & (sig==1'b0)

可能RegEx最适合拆分,但我将如何定义界限?也许我需要某种可用于跟踪文字标记何时开始或结束的字母表,例如:&|=()!~ 但是我怎么能告诉in和之间的所有内容out,即== 1'b1) | !,不应该被标记?

4

1 回答 1

2

(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|'))/

于 2013-04-14T14:51:03.383 回答