#!perl -w my%Token; my$atTop=1; my$atBotton=0; my@Bottom; my@allyaccrule; my$yaccrule; my$yaccalternative; open OFH, ">verilogaYacc.y"; print OFH "/* File automatically created by " . __FILE__ . " */\n"; print OFH "\n"; while(<>) { if(/R_admsParse/) { $atTop=0; } if($atTop) { print OFH; } if(/^R_/) { chop; $yaccrule->{name}=$_; } elsif(s/^\s+\|\s*//) { undef $yaccalternative; $yaccalternative->{precedence}=$1 if s/\s+(\%.*)$//; foreach my$token(split /\s+/, $_) { push @{$yaccalternative->{child}},$token; $Token{$token}=1 if ($token=~/tk_/); } push @{$yaccrule->{alternative}}, $yaccalternative; } elsif(s/CODE/ /) { $yaccalternative->{code}.=$_; } elsif (/^\s+;$/) { push @allyaccrule,$yaccrule; undef $yaccrule; } elsif (/^%%$/) { $atBotton=1; } if($atBotton) { push @Bottom,$_; } } foreach (keys %Token) { print OFH "\%token <_lexval> $_\n"; } print OFH "\n"; foreach (@allyaccrule) { print OFH "\%type <_yaccval> $_->{name}\n"; } print OFH "\n"; print OFH "%%\n"; foreach my $myrule (@allyaccrule) { print OFH $myrule->{name}; print OFH "\n"; my$firstalternative=$myrule->{alternative}->[0]; my$index=0; foreach my$myalter(@{$myrule->{alternative}}) { my$tkindex; print OFH " "x8; print OFH ($index==0)?": ":"| "; print OFH join " ", @{$myalter->{child}} if $myalter->{child}; print OFH " " . $myalter->{precedence} if (defined $myalter->{precedence}); print OFH "\n"; print OFH " "x10 . "{\n"; $tkindex=1; foreach(@{$myalter->{child}}) { if(m/tk_/ && ($myalter->{code} && ($myalter->{code} =~ m/mylexval$tkindex/))) { print OFH " "x12 . "char* mylexval$tkindex=adms_lexval_valueof_string(\$$tkindex);\n"; } $tkindex++; } print OFH $myalter->{code} if $myalter->{code}; $tkindex=1; foreach(@{$myalter->{child}}) { if(m/tk_/) { print OFH " "x12 . "adms_lexval_free(\$$tkindex);\n"; } $tkindex++; } print OFH " "x10 . "}\n"; $index++; } print OFH " "x8 . ";\n"; } print OFH @Bottom; close OFH;