清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#
# @File : Lexical_Analyzer.pl
# @Author: Roc
# @Date : 2013/10/21
# @Func : Lexical analyser
# @Idea : In this program,we cut sentences to words.
# Then,we will match each word.
#
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#!/usr/bin/perl
use warnings;
use 5.010;
say "Please input your program here.(Input '__END__' to stop inputing)";
##
#input here
#
open (FH, ">LexicalAnalyser.txt") or die "can't open the file: $!";
while (<STDIN>) {
if (/__END__/){
#Input over.Close file
close (FH) or die "Can't close file: $!";
last; #Interrupt here
} else {
#debug
#print "I saw $_";
chomp ($_); #delete 'Enter'
say FH $_;
}
} #End of while
##
#output program here.We just test our input.
#
$count = 1;
say "\n+------------------------------------------------+";
say "\tInput over.Here is your program.\n";
#
#Read file here.
#We just want to see if we write into the file
#
open (FH, "<LexicalAnalyser.txt") or die "can't open the file: $!";
foreach (<FH>) {
chomp;
say "Line $count: $_";
$count++;
}
say "+------------------------------------------------+\n";
close (FH) or die "can't close file: $!";
#debug
#say "@Tmp\n";
##
#Exchange special flags here.I just list a little:like , } { ) ( and ;
#
open (FH, "<LexicalAnalyser.txt") or die "can't open the file: $!";
foreach (<FH>){
foreach (split){
#debug
#print "!!!!!!!!!!!!!!!!!!!!\n";
#We have already separated each word.
#Thus, it doesn't matter if we add g here.
s/(\w+)(,|;|\)|\(|\}|\{)/$1 $2/g;
s/(,|;|\(|\)|\{|\}|:|\[|\])(\w+)/$1 $2/g;
s/(;|\(|\)|\{|\})/ $1/g;
#Store in Tmp2
push @Tmp2, $_;
}
}
close (FH) or die "can't close file: $!";
##
#We match here
#
foreach (@Tmp2){
#debug
#say "$_";
foreach (split){
#debug
#print "!!!!!!!!!!!!!!!!!!!!\n";
if ($_ =~ /main\(\)/){
push @Tmp3, "\(2, \"main\"\)";
} elsif ($_ =~ /(int|float|for|while|do|return|break|continue|unsigned|public|void)/){
push @Tmp3, "\(1, \"$_\"\)";
} elsif ($_ =~ /[a-z]+/){
push @Tmp3, "\(2, \"$_\"\)";
} elsif ($_ =~ /\p{Digit}.*/){
push @Tmp3, "\(3, \"$_\"\)";
} elsif ($_ =~ /(=|>=|<=|!=|!|>|<|\+|-|\*|\/)/){
push @Tmp3, "\(4, \"$_\"\)";
} elsif ($_ =~ /(\(|\)|\{|\}|;|,|:)/){
push @Tmp3, "\(5, \"$_\"\)";
}
#debug
#print "$_\n";
# push @Tmp1, $_; #再设置一个暂存区
} #End of foreach(split)
} #End of foreach(@Tmp2)
##
#Output here
#
say "++++++++++++Final Answer+++++++++++";
say "-----------------------------------";
foreach (@Tmp3){
say "$_";
}
say "+---------------------------------+";
say "+++++++++++++++END+++++++++++++++++";