fooparser.pm

来自「用于词法分析的词法分析器」· PM 代码 · 共 90 行

PM
90
字号
# $Id: FooParser.pm,v 1.2 1996/11/20 10:01:34 matt Exp $## Foo parser class.## (c) June 96 Matt Phillips.package FooParser;use FooScanner;use FooObject;# creates a new FooParser object reading from file.  parsing occurs# immediately: the resulting object can be accessed with getRoot (),# an array of error messages can be accessed with getErrors ().sub new{  my ($class, $file) = @_;  my $scanner = new FooScanner ($file);  my $self = {'scanner' => $scanner,	      'errors' => undef};  bless $self, $class;  $scanner->getNext ();  $self->{'root'} = $self->parseObject ($scanner);  return $self;}# return the root object read by the parser.sub getRoot{  my $self = shift;  return $self->{'root'};}# return an array of error messages or undef if no errors occurred.sub getErrors{  my $self = shift;  return $self->{'scanner'}->getErrors ();}sub parseObject{  my ($self, $scanner) = @_;  if ($scanner->getSymbol () eq 'string')  {    my $object = FooObject::new FooObject ($scanner->getText ());    $scanner->getNext ();    return $object;  } else  {    $scanner->mustbe ('(');    my $object = FooObject::new FooObject ();    $self->parseAttrs ($scanner, $object);    $scanner->mustbe (')');    return $object;  }}sub parseAttrs{  my ($self, $scanner, $object) = @_;  while ($scanner->getSymbol () eq 'ident')  {    my $attr = $scanner->getText ();    $scanner->getNext ();    if ($scanner->have ('['))    {      while ($scanner->getSymbol () eq '(' ||	     $scanner->getSymbol () eq 'string')      {	$object->addAttr ($attr, $self->parseObject ($scanner));      }      $scanner->mustbe (']');    } else    {      $object->addAttr ($attr, $self->parseObject ($scanner));    }  }}1;

⌨️ 快捷键说明

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