⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 elex

📁 用于词法分析的词法分析器
💻
字号:
#!/usr/local/bin/perl# $Id: elex,v 1.13 1997/04/20 02:14:50 matt Exp $## Elex front end.## (c) June 1996 Matt Phillips.BEGIN{  # extract root dir from exec path  ($root) = ($0 =~ m<^(.*)/[^/]*$>);  $root = '.' if !$root;  # set @INC correctly  if (-d "$root/foo")  {    # development configuration    push (@INC, "$root/foo");    $configFile = "$root/elex.cfg";  } else  {    # installed configuration    $root = "$root/..";    push (@INC, "$root/lib/foo");    $configFile = "$root/lib/elex.cfg";  }  push (@INC, "$root/util");}use FooParser;use FooObject;use File::Basename;use Getopt::Std;use StdApp;#----------------------------------------------------------------------# defines$usage ='  Usage: elex [options] <file>    <file> is either an Elex scanner (.elx) or an Elex scanner    definition (.esd) generated by using Elex with the \'-c\' option.  Options:    -c           compile only (generate .esd and .ecf)    -l language  set language for scanner    -d           run debugger    -v           verbose mode    -V           display Elex version';#----------------------------------------------------------------------# subssub deleteTempFiles{  for (@tempFiles)  {    unlink ($_);  }  @tempFiles = ();  return 1;}# make path into absolute by adding $root to the start if the path is# not already absolute.sub makeAbsolutePath{  my $path = shift;  if (!($path =~ m<^/>))  {    $path = "$root/$path";  }  return $path;}# work out the 'default' (ie. first mentioned) language from codefrags# file.sub divineLanguage{  my $codeFrags = shift;  my $language;  say ("scanning $codeFrags for default language");  open ($codeFrags, $codeFrags) || return undef;  while (($_ = <$codeFrags>) && !$language)  {    if (/^*/)    {      $_ = <$codeFrags>;      chomp;      if (!/^[>*]/ && $_ ne '')      {	$language = $_;      }    }  }  # if we failed to divine the language, then use the default from  # config.  if (!$language)  {    $language = $config->getAttrStringPath ('codegen/default');  }  say ("language is '$language'");  close ($codeFrags);  return $language;}sub elexToScannerDef{  my ($elxFile) = shift;  my $esdFile = "/tmp/elex$$.esd";  my $ecfFile = "/tmp/elex$$.ecf";  my $compiler = makeAbsolutePath ($config->getAttrString ('compiler'));  push (@tempFiles, $esdFile);  push (@tempFiles, $ecfFile);  systemExec (eval ("\"$compiler\""), "compile failed");  return ($esdFile, $ecfFile);}sub scannerDefToCode{  my ($esdFile, $ecfFile, $scannerBase) = @_;  my $outputBase = "/tmp/elex$$";  my $language = $opt_l ? $opt_l : divineLanguage ($ecfFile);  my $outputFiles = $config->getAttrsPath ("codegen/generators/$language/outputs");  my $codeGenerator =    $config->getAttrStringPath ("codegen/generators/$language/exec");  if ($language)  {    if ($codeGenerator)    {      # build output file list      for (@{$config->getAttrsPath ("codegen/generators/$language/outputs")})      {	my $file = $_->getAttr ();	$file = eval ("\"$file\"");	push (@outputFiles, $file);	push (@tempFiles, $file);      }      # expand variables in codeGenerator      $codeGenerator = eval ("\"$codeGenerator\"");      if (!$codeGenerator)      {	error ("invalid code generator exec for '$language'");      } else      {	systemExec (makeAbsolutePath ($codeGenerator));      }    } else    {      error ("no code generator for language '$language'");    }  } else  {    error ("cannot guess language: specify using '-l' option");  }  return @outputFiles;}sub debugScannerDef{  my $esdFile = shift;  my $debugger = $config->getAttrString ("debug");  error ("no debugger available") if !$debugger;  $debugger = eval ("\"$debugger\"");  if ($debugger)  {    systemExec (makeAbsolutePath ($debugger));  } else  {    error ("error in debug setting");  }}sub copyOutfiles{  my ($base, @files) = @_;  my $file;  for $file (@files)  {    my $fileExt = (fileparse ($file, '\..*')) [2];    my $targetFile = "$base$fileExt";    systemExec ("/bin/cp $file $targetFile 2> /dev/null 1> /dev/null",		"could not create $targetFile");  }}#----------------------------------------------------------------------# mainaddCleanup ('deleteTemps', \&deleteTempFiles);# check command lineif (!getopts ('cl:vdV') || (!$opt_V && $#ARGV != 0)){  print STDERR ($usage);  exit (1);}$file = $ARGV [0];($fileName, $filePath, $fileExt) = (fileparse ($file, '\..*'));$fileBase = "$filePath$fileName";# read configopen (CONFIG, $configFile) || error ("could not open $configFile: $!");$parser = new FooParser (\*CONFIG);close (CONFIG);if ($parser->getErrors ()){  error ("problems parsing $configFile:\n".	 join ("\n ", @{$parser->getErrors ()})."\n");}$config = $parser->getRoot ();# check for version optionif ($opt_V){  print ("Elex version ".$config->getAttrString ('version'), "\n");  exit (0);}# process fileif ($fileExt eq '.elx'){  ($esdFile, $ecfFile) = elexToScannerDef ($file);} elsif ($fileExt eq '.esd'){  $esdFile = $file;  $ecfFile = "$fileBase.ecf";} else{  error ("unknown file type $file");}if ($opt_c){  if ($esdFile ne $file)  {    copyOutfiles ($fileBase, $esdFile, $ecfFile);  }} elsif ($opt_d){  debugScannerDef ($esdFile);} else{  @outFiles = scannerDefToCode ($esdFile, $ecfFile, $fileBase);  copyOutfiles ($fileBase, @outFiles);}doCleanup ();exit (0);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -