#!/perl/bin/perl # # test.pl -- use strict; use warnings; use diagnostics; use Parse::RecDescent; use Data::Dumper; $::RD_TRACE = 1 if ( $ARGV[0] ); $::RD_AUTOACTION = q { [@item[0..$#item]] }; my $parser = new Parse::RecDescent( q{ startrule: script script: 'script' '[' script_options(s /,/) ']' script_body script_options: script_option '=' qstring script_option: 'tag-prefix' | 'language' | 'implements-prefix' script_body: '{' script_line(s?) '}' script_line: newline(s?) /\s.*/ newline newline: "\n" is_printable: /[a-zA-Z0-9_&\#;:\$()\'= ,!\@\/.\[\]\-]+/ qstring: '"' is_printable '"' } ); #______________________________________________________________________________ my $data; my $test; while () { $test .= $_; } $data = $parser->startrule($test); print Dumper $data,"\n"; __DATA__ script [tag-prefix="msxsl" ,language="VBScript", implements-prefix="user"] { dim fs dim FoldersOnly dim FilesOnly dim FilesAndFolders function getFolder(dirName,Mode) dim folder init set fso = CreateObject("Scripting.FileSystemObject") set folder = fso.GetFolder(dirName) set folderDoc=createObject("MSXML2.FreeThreadedDOMDocument") folderDoc.setProperty "SelectionLanguage","XPath" folderDoc.async=false folderDoc.loadXML "" set folderNode=folderDoc.documentElement folderNode.setAttribute "name",folder.name folderNode.setAttribute "path",folder.path folderNode.setAttribute "dateCreated",mapDate(folder.dateCreated) folderNode.setAttribute "dateLastAccessed",mapDate(folder.dateLastAccessed) folderNode.setAttribute "shortName",folder.shortName folderNode.setAttribute "shortPath",folder.shortPath folderNode.setAttribute "size",folder.size folderNode.setAttribute "type",folder.type if mode=FoldersOnly or mode=FilesAndFolders then getFolders folder,folderNode,dirName,mode end if if mode=FilesOnly or mode=FilesAndFolders then getFiles folder,folderNode,dirName end if set getFolder=folderDoc end function }