PATH:
usr
/
share
/
doc
/
perl-Parse-RecDescent-1.967009
/
demo
#!/usr/bin/perl -w package XML2DS; use Parse::RecDescent; @ISA = qw( Parse::RecDescent ); sub allow_nested { my ($parser, $tag, @nestedtags) = @_; my $nestedtags = join '|', map { '^'.$_.'$' } @nestedtags; $parser->{allow}{$tag} = qr/$nestedtags/; } sub new { bless Parse::RecDescent->new(<<'EOGRAMMAR'), XML2DS; xml: unitag(?) | tag content[$item[1]](s) endtag[$item[1]] { bless $item[2], $item[1]} unitag: m{<([a-zA-Z]+)/>} { bless [], $1 } tag: m{<([a-zA-Z]+)>} { $return = $1 } endtag: m{</$arg[0]>} | m{(\S+)} <error: was expecting </$arg[0]> but found $1 instead> content: <rulevar: local $error> content: rawtext <commit> check[$arg[0], $item[1]] | xml <commit> check[$arg[0], $item[1]] | <error?: $error> <error: error in <$arg[0]> block> rawtext: m{[^<]+} { bless \$item[1], 'rawtext' } check: { my ($outertag, $innertag) = ($arg[0], ref $arg[1]); $return = $arg[1] if !$thisparser->{allow}{$outertag} || $innertag =~ $thisparser->{allow}{$outertag}; $error = ($innertag eq 'rawtext') ? "Raw text not valid in <$outertag> block" : "<$innertag> tag not valid in <$outertag> block"; undef; } EOGRAMMAR } package main; use Data::Dumper; my $parser = XML2DS->new(); $parser->allow_nested( Test => qw(Example) ); $parser->allow_nested( Example => qw(Data rawtext) ); $parser->allow_nested( Data => qw(SubData rawtext) ); $parser->allow_nested( SubData => qw(Example rawtext) ); my $xml = join '', <DATA>; if (my $tree = $parser->xml($xml)) { print Data::Dumper->Dump([$tree]); } __DATA__ <Test> <Example/> <Example> <Data> raw data <SubData> raw subdata </SubData> more raw data </Data> <Data> still more raw data <SubData> <Example> <Data> nested example data </Data> </Example> </SubData> </Data> last rawtext </Example> </Test>
[-] demo_cpp.pl
[edit]
[-] demo_autorule.pl
[edit]
[-] demo_errors.pl
[edit]
[-] demo_piecewise.pl
[edit]
[-] demo_logic.pl
[edit]
[-] demo_skipcomment.pl
[edit]
[-] demo_implicit.pl
[edit]
[-] demo_separators.pl
[edit]
[-] demo_perlparsing.pl
[edit]
[-] demo_street.pl
[edit]
[-] demo_scoredsep.pl
[edit]
[-] demo.c
[edit]
[-] demo_textgen.pl
[edit]
[-] demo.pl
[edit]
[-] demo_calc.pl
[edit]
[+]
..
[-] demo_another_Cgrammar.pl
[edit]
[-] demo_matchrule2.pl
[edit]
[-] demo_mccoy.pl
[edit]
[-] demo_restructure_painful.pl
[edit]
[-] demo_methods.pl
[edit]
[-] demo_language.pl
[edit]
[-] demo_selfmod.pl
[edit]
[-] demo_OOautoparsetree.pl
[edit]
[-] demo_codeblock.pl
[edit]
[-] demo_simplequery.pl
[edit]
[-] demo_restructure_easy.pl
[edit]
[-] demo_tokens.pl
[edit]
[-] demo_decomment.pl
[edit]
[-] demo_recipe.pl
[edit]
[-] demo_delete.pl
[edit]
[-] demo_lisplike.pl
[edit]
[-] demo_bad.pl
[edit]
[-] demo_arithmetic.pl
[edit]
[-] demo_leftassoc.pl
[edit]
[-] demo_PerlCSV.pl
[edit]
[-] demo_metaRD.pm
[edit]
[-] demo_derived.pl
[edit]
[-] demo_opreps.pl
[edit]
[-] demo_matchrule.pl
[edit]
[-] demo_LaTeXish_autoact.pl
[edit]
[-] demo_operator.pl
[edit]
[-] demo_autoscoresep.pl
[edit]
[-] demo_Cgrammar_v2.pl
[edit]
[-] demo_NL2SQL.pl
[edit]
[-] demo_Cgrammar.pl
[edit]
[-] demo_randomsentence.pl
[edit]
[-] demo_template.pl
[edit]
[-] demo_quicklist.pl
[edit]
[-] demo_itemhash.pl
[edit]
[-] demo_buildcalc.pl
[edit]
[-] demo_leftop.pl
[edit]
[-] demo_decomment_nonlocal.pl
[edit]
[-] demo_dot.pl
[edit]
[-] demo_LaTeXish.pl
[edit]
[-] demo_precalc.pl
[edit]
[-] demo_eval.pl
[edit]
[-] demo_autostub.pl
[edit]
[-] demo_whoson.pl
[edit]
[-] demo_lexer.pl
[edit]
[-] demo_OOparsetree.pl
[edit]
[-] demo_parsetree.pl
[edit]
[-] demo_simple.pl
[edit]
[-] demo_embedding.pl
[edit]
[-] demo_simpleXML.pl
[edit]
[-] demo_undumper.pl
[edit]