/[A3C]/lib/A3C/PHP.pm
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /lib/A3C/PHP.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 133 - (hide annotations)
Fri May 30 20:04:23 2008 UTC (15 years, 11 months ago) by dpavlin
File size: 2472 byte(s)
Added Parse::RecDescent PHP parser based on PHP::Include

PHP::Include puts new variables in current scope, while we
prefer to get single hash with all defined values.
1 dpavlin 133 package A3C::PHP;
2     use warnings;
3     use strict;
4     use Parse::RecDescent;
5     use Data::Dump qw/dump/;
6     use File::Slurp;
7    
8     =head1 NAME
9    
10     A3C::PHP
11    
12     =head1 DESCRIPTION
13    
14     For integration with php application there is simple php config
15     parser based on L<PHP::Include::Vars>
16    
17     =head1 METHODS
18    
19     =cut
20    
21     my $debug = 0;
22    
23     our $perl = '';
24     our $data;
25     my $grammar =
26    
27     <<'GRAMMAR';
28    
29     php_vars: php_start statement(s) php_end
30    
31     php_start: /\s*<\?(php)?\s*/
32    
33     php_end: /\s*\?>\s*/
34    
35     statement: comment | assignment
36    
37     comment: /\s*(\#|\/\/).*/
38    
39     assignment: ( var_assign | hash_assign | array_assign | constant ) /;/
40     {
41     $A3C::PHP::perl .= $item[1];
42     }
43    
44     var_assign: variable /=/ scalar
45     {
46     $item[1] =~ s/^\$//;
47     $return = "\$data->{ $item[1] } = $item[3]; # scalar\n";
48     }
49    
50     hash_assign: variable /=/ /Array\s*\(/i pair(s /,/) /\s*(,\s*)?\)/
51     {
52     $item[1] =~ s/^\$//;
53     $return = "\$data->{ $item[1] } = $item[4]; # hash\n";
54     $return = "\%{\$data->{ $item[1] }} =(" . join( ',', @{$item[4]} ) . ");\t# hash\n";
55     }
56    
57     array_assign: variable /=/ /Array\s*\(/i element(s /,/) /\s*(,\s*)?\)/
58     {
59     $item[1] =~ s/^\$//;
60     $return = "\@{\$data->{ $item[1] }}=(" . join( ',', @{$item[4]} ) . ");\t# array\n"
61     }
62    
63     scalar: string | number
64    
65     variable: /\$[a-zA-Z_][0-9a-zA-Z_]*/
66    
67     number: /-?[0-9.]+/
68    
69     string: double_quoted | single_quoted
70    
71     double_quoted: /".*?"/
72    
73     single_quoted: /'.*?'/
74    
75     element: scalar | bareword
76    
77     pair: scalar /=>/ ( scalar | bareword )
78     {
79     $return = $item[1] . '=>' . $item[3];
80     }
81    
82     bareword: /[0-9a-zA-Z_]+/
83    
84     constant: /define\s*\(/ string /,/ scalar /\)/
85     {
86     $return = "use constant $item[2] => $item[4];\n";
87     }
88    
89     comments: /^#.*$/
90    
91     whitespace: /^\s+$/
92    
93     GRAMMAR
94    
95     =head1 parse
96    
97     my $data = A3C::PHP->parse( $php_code );
98    
99     =cut
100    
101     sub parse {
102     my $self = shift;
103     my $php = shift or die "no php?";
104     $perl = '';
105     $::RD_TRACE = 1 if $debug;
106     my $parser = Parse::RecDescent->new( $grammar );
107     warn dump( $parser->php_vars( $php ) );
108     print STDERR "\n\nGENERATED PERL:\n\n", $perl, "\n\n" if $debug;
109     my $data;
110     eval $perl;
111     die "$@" if $@;
112     return $data;
113     }
114    
115     =head1 parse_file
116    
117     my $data = A3C::PHP->parse_file( '/path/to/code.php' );
118    
119     =cut
120    
121     sub parse_file {
122     my $self = shift;
123     $self->parse( scalar read_file( shift ));
124     }
125    
126     =head1 SEE ALSO
127    
128     =over 4
129    
130     =item * PHP::Include
131    
132     =item * Parse::RecDescent
133    
134     =head1 AUTHORS
135    
136     =over 4
137    
138     =item * Ed Summers <ehs@pobox.com> wrote L<PHP::Include> on which this code is based
139    
140     =cut
141    
142     1;

  ViewVC Help
Powered by ViewVC 1.1.26