📄 fooparser.pm
字号:
# $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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -