annotate xslscript.pl @ 12:cc0402def1f9 default tip

XSLScript: added CDATA support. Notably, this simplifies adding javascript code to templates, which otherwise require complex escaping. Requested by Igor Sysoev.
author Maxim Dounin <mdounin@mdounin.ru>
date Sun, 14 Apr 2024 23:11:11 +0300
parents 01dc9ba12e1b
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1 #!/usr/bin/perl
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3 # (C) Maxim Dounin
10
cb41e7c634c5 XSLScript: README and LICENSE.
Maxim Dounin <mdounin@mdounin.ru>
parents: 9
diff changeset
4 # (C) Nginx, Inc.
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
5
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
6 # Convert from XSLScript to XSLT.
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
7 #
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
8 # Originally XSLScript was written by Paul Tchistopolskii. It is believed
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
9 # to be mostly identical to XSLT, but uses shorter syntax. Original
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
10 # implementation has major Java dependency, no longer supported and hard
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
11 # to find.
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
12 #
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
13 # This code doesn't pretend to be a full replacement, but rather an attempt
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
14 # to provide functionality needed for nginx documentation.
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
15
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
16 ###############################################################################
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
17
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
18 use warnings;
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
19 use strict;
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
20
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
21 use Parse::RecDescent;
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
22 use Getopt::Long;
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
23 use Data::Dumper qw/Dumper/;
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
24
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
25 ###############################################################################
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
26
7
9a283d72ddc3 XSLScript: --dump option.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
27 my $dump = 0;
9
e93b6e98b817 XSLScript: -o option.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8
diff changeset
28 my $output;
7
9a283d72ddc3 XSLScript: --dump option.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
29
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
30 GetOptions(
9
e93b6e98b817 XSLScript: -o option.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8
diff changeset
31 "output|o=s" => \$output,
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
32 "trace!" => \$::RD_TRACE,
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
33 "hint!" => \$::RD_HINT,
7
9a283d72ddc3 XSLScript: --dump option.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
34 "dump!" => \$dump,
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
35 )
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
36 or die "oops\n";
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
37
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
38 ###############################################################################
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
39
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
40 my $grammar = <<'EOF';
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
41
11
01dc9ba12e1b XSLScript: typo fixed.
Maxim Dounin <mdounin@mdounin.ru>
parents: 10
diff changeset
42 # XSLScript grammar, reconstructed
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
43
8
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
44 startrule : <skip:""> item(s) eofile
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
45 { $return = $item{'item(s)'}; 1 }
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
46
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
47 item : "<!--" <commit> comment
12
cc0402def1f9 XSLScript: added CDATA support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 11
diff changeset
48 | "<![CDATA[" <commit> cdata
3
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
49 | "!!" <commit> exclam_double
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
50 | "!{" <commit> exclam_xpath
4
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
51 | "!" name <commit> params
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
52 { $return = [
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
53 "X:call-template", "name", $item{name}, [],
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
54 $item{params}
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
55 ]; 1 }
8
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
56 | "<%" <commit> space instruction space "%>"
3
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
57 { $return = $item{instruction}; 1 }
8
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
58 | "<" name attrs space ">" <commit> item(s?) "</" name ">"
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
59 { $return = [ "tag", $item{name}, $item{attrs}, $item{'item(s?)'} ]; 1 }
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
60 | "<" <commit> name attrs space "/>"
4
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
61 { $return = [ "tag", $item{name}, $item{attrs} ]; 1 }
8
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
62 | "X:variable" space <commit> xvariable
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
63 | "X:var" space <commit> xvariable
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
64 | "X:template" space <commit> xtemplate
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
65 | "X:if" space <commit> xif
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
66 | "X:param" space <commit> xparam
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
67 | "X:for-each" space <commit> xforeach
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
68 | "X:sort" space <commit> xsort
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
69 | "X:when" space <commit> xwhen
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
70 | "X:attribute" space <commit> xattribute
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
71 | "X:output" space <commit> xoutput
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
72 | "X:copy-of" space <commit> xcopyof
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
73 | instruction space <commit> attrs body
4
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
74 { $return = [ $item{instruction}, $item{attrs}, $item{body} ]; 1 }
8
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
75 | space_notempty
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
76 | text
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
77 | <error>
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
78
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
79 # list of simple instructions
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
80
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
81 instruction : "X:stylesheet"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
82 | "X:transform"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
83 | "X:attribute-set"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
84 | "X:element"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
85 | "X:apply-templates"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
86 | "X:choose"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
87 | "X:otherwise"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
88 | "X:value-of"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
89 | "X:apply-imports"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
90 | "X:number"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
91 | "X:include"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
92 | "X:import"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
93 | "X:strip-space"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
94 | "X:preserve-space"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
95 | "X:copy"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
96 | "X:text"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
97 | "X:comment"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
98 | "X:processing-instruction"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
99 | "X:decimal-format"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
100 | "X:namespace-alias"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
101 | "X:key"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
102 | "X:fallback"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
103 | "X:message"
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
104
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
105 # comments, <!-- ... -->
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
106 # not sure if it's something to be interpreted specially
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
107 # likely an artifact of our dump process
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
108
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
109 comment : /((?!-->).)*/ms "-->"
8
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
110 { $return = "<!--" . $item[1] . "-->"; 1 }
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
111
12
cc0402def1f9 XSLScript: added CDATA support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 11
diff changeset
112 # cdata, <![CDATA[ ... ]]>
cc0402def1f9 XSLScript: added CDATA support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 11
diff changeset
113
cc0402def1f9 XSLScript: added CDATA support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 11
diff changeset
114 cdata : /((?!]]>).)*/ms "]]>"
cc0402def1f9 XSLScript: added CDATA support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 11
diff changeset
115 { $return = "<![CDATA[" . $item[1] . "]]>"; 1 }
cc0402def1f9 XSLScript: added CDATA support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 11
diff changeset
116
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
117 # special chars: ', ", {, }, \
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
118 # if used in text, they needs to be escaped with backslash
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
119
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
120 text : quoted | unreserved | "'" | "\"" | "{"
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
121 quoted : "\\" special
3
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
122 { $return = $item{special}; 1; }
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
123 special : "'" | "\"" | "\\" | "{" | "}"
8
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
124 unreserved : /[^'"\\{}<\s]+\s*/ms
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
125
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
126 # whitespace
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
127
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
128 space : /\s*/ms
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
129 space_notempty : /\s+/ms
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
130
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
131 # shortcuts:
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
132 #
3
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
133 # !! for X:apply-templates
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
134 # !{xpath-expression} for X:value-of select="xpath-expression";
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
135 # !foo() for X:call-template name="foo"
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
136
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
137 # !root (path = { !{ substring($DIRNAME, 2) } })
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
138 # !root (path = "substring-after($path, '/')")
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
139
8
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
140 exclam_double : space value(?) params(?) attrs space ";"
4
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
141 { $return = [
8
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
142 "X:apply-templates", "select", $item{'value(?)'}[0],
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
143 $item{attrs}, $item{'params(?)'}[0]
4
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
144 ]; 1 }
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
145
4
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
146 exclam_xpath : xpath "}"
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
147 { $return = [
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
148 "X:value-of", "select", $item{xpath}, []
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
149 ]; 1 }
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
150 xpath : /("[^"]*"|'[^']*'|[^}'"])*/ms
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
151
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
152 # instruction attributes
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
153 # name="value"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
154
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
155 attrs : attr(s?)
8
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
156 attr : space name space "=" space value
4
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
157 { $return = $item{name} . "=" . $item{value}; }
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
158 name : /[a-z0-9_:-]+/i
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
159 value : /"[^"]*"/
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
160
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
161 # template parameters
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
162 # ( bar="init", baz={markup} )
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
163
8
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
164 params : space "(" param(s? /\s*,\s*/) ")" space
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
165 { $return = $item[3]; 1 }
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
166 param : space name space "=" space value space
4
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
167 { $return = [
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
168 "X:with-param",
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
169 "select", $item{value},
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
170 "name", $item{name},
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
171 []
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
172 ]; 1 }
8
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
173 | space name space "=" <commit> space "{" item(s) "}"
4
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
174 { $return = [
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
175 "X:with-param", "name", $item{name}, [],
8
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
176 $item{'item(s)'}
4
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
177 ]; 1 }
8
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
178 | space name
4
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
179 { $return = [
5
2d6764d9980b XSLScript: various fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
180 "X:param", "name", $item{name}, []
4
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
181 ]; 1 }
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
182
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
183 # instruction body
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
184 # ";" for empty body, "{ ... }" otherwise
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
185
8
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
186 body : space ";"
3
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
187 { $return = ""; }
8
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
188 | space "{" <commit> item(s?) "}" (space ";")(?)
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
189 { $return = $item{'item(s?)'}; 1 }
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
190
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
191 # special handling of some instructions
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
192 # X:if attribute is test=
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
193
8
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
194 xif : value body space "else" <commit> body
4
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
195 { $return = [
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
196 "X:choose", [], [
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
197 [ "X:when", "test", $item[1], [], $item[2] ],
8
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
198 [ "X:otherwise", [], $item[6] ]
4
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
199 ]
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
200 ]; 1 }
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
201 | value attrs body
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
202 { $return = [
5
2d6764d9980b XSLScript: various fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
203 "X:if", "test", $item{value}, $item{attrs}, $item{body},
4
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
204 ]; 1 }
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
205 | attrs body
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
206 { $return = [
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
207 "X:if", $item{attrs}, $item{body},
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
208 ]; 1 }
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
209 | <error>
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
210
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
211 # X:template name(params) = "match" {
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
212 # X:template name( bar="init", baz={markup} ) = "match" mode="some" {
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
213
8
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
214 xtemplate : name(?) params(?) space
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
215 (space "=" space value)(?) attrs body
4
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
216 { $return = [
8
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
217 "X:template",
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
218 "name", $item{'name(?)'}[0],
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
219 "match", $item[4][0],
4
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
220 $item{attrs},
5
2d6764d9980b XSLScript: various fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
221 [ ($item[2][0] ? @{$item[2][0]} : ()), @{$item{body}} ]
4
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
222 ]; 1 }
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
223
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
224 # X:var LINK = "/article/@link";
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
225 # X:var year = { ... }
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
226 # semicolon is optional
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
227
8
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
228 xvariable : name space "=" space value attrs body
4
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
229 { $return = [
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
230 "X:variable",
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
231 "select", $item{value},
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
232 "name", $item{name},
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
233 $item{attrs}, $item{body}
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
234 ]; 1 }
8
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
235 | name space "=" space attrs body
4
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
236 { $return = [
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
237 "X:variable",
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
238 "name", $item{name},
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
239 $item{attrs}, $item{body}
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
240 ]; 1 }
8
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
241 | name space "=" space value
4
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
242 { $return = [
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
243 "X:variable",
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
244 "select", $item{value},
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
245 "name", $item{name},
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
246 []
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
247 ]; 1 }
8
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
248 | name space "="
4
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
249 { $return = [
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
250 "X:variable",
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
251 "name", $item{name},
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
252 []
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
253 ]; 1 }
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
254 | <error>
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
255
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
256 # X:param XML = "'../xml'";
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
257 # X:param YEAR;
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
258
8
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
259 xparam : name space "=" space value attrs body
4
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
260 { $return = [
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
261 "X:param",
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
262 "select", $item{value},
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
263 "name", $item{name},
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
264 $item{attrs}, $item{body}
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
265 ]; 1 }
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
266 | name attrs body
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
267 { $return = [
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
268 "X:param", "name", $item{name},
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
269 $item{attrs}, $item{body}
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
270 ]; 1 }
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
271
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
272 # X:for-each "section[@id and @name]" { ... }
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
273 # X:for-each "link", X:sort "@id" {
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
274
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
275 xforeach : value attrs body
4
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
276 { $return = [
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
277 "X:for-each", "select", $item{value}, $item{attrs}, $item{body}
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
278 ]; 1 }
8
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
279 | value attrs space
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
280 "," space "X:sort" <commit> space value attrs body
4
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
281 { $return = [
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
282 "X:for-each", "select", $item[1], $item[2], [
8
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
283 [ "X:sort", "select", $item[9], $item[10] ],
4
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
284 @{$item{body}}
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
285 ]
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
286 ]; 1 }
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
287
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
288 # X:sort select
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
289 # X:sort "@id"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
290
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
291 xsort : value attrs body
4
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
292 { $return = [
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
293 "X:sort", "select", $item{value}, $item{attrs}, $item{body}
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
294 ]; 1 }
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
295
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
296 # X:when "position() = 1" { ... }
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
297
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
298 xwhen : value attrs body
4
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
299 { $return = [
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
300 "X:when", "test", $item{value}, $item{attrs}, $item{body}
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
301 ]; 1 }
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
302
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
303 # X:attribute "href" { ... }
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
304
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
305 xattribute : value attrs body
4
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
306 { $return = [
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
307 "X:attribute", "name", $item{value}, $item{attrs}, $item{body}
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
308 ]; 1 }
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
309
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
310 # X:output
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
311 # semicolon is optional
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
312
3
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
313 xoutput : attrs body(?)
4
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
314 { $return = [
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
315 "X:output", undef, undef, $item{attrs}, $item{body}
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
316 ]; 1 }
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
317
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
318 # "X:copy-of"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
319 # semicolon is optional
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
320
3
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
321 xcopyof : value attrs body(?)
4
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
322 { $return = [
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
323 "X:copy-of", "select", $item{value}, $item{attrs}, $item{body}
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
324 ]; 1 }
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
325
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
326 # eof
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
327
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
328 eofile : /^\Z/
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
329
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
330 EOF
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
331
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
332 ###############################################################################
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
333
4
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
334 sub format_tree {
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
335 my ($tree, $indent) = @_;
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
336 my $s = '';
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
337
5
2d6764d9980b XSLScript: various fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
338 if (!defined $indent) {
2d6764d9980b XSLScript: various fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
339 $indent = 0;
2d6764d9980b XSLScript: various fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
340 $s .= '<?xml version="1.0" encoding="utf-8"?>' . "\n";
2d6764d9980b XSLScript: various fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
341 }
2d6764d9980b XSLScript: various fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
342
4
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
343 my $space = " " x $indent;
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
344
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
345 foreach my $el (@{$tree}) {
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
346 if (!defined $el) {
5
2d6764d9980b XSLScript: various fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
347 warn "Undefined element in output.\n";
4
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
348 $s .= $space . "(undef)" . "\n";
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
349 next;
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
350 }
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
351
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
352 if (not ref($el) && defined $el) {
8
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
353 if ($el =~ /^<!--(.*)-->$/s) {
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
354 my $comment = $1;
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
355 $comment =~ s/--/../sg;
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
356 $el = "<!--" . $comment . "-->";
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
357 }
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
358
5
2d6764d9980b XSLScript: various fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
359 $s .= $el;
4
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
360 next;
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
361 }
3
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
362
4
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
363 die if ref($el) ne 'ARRAY';
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
364
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
365 my $tag = $el->[0];
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
366
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
367 if ($tag eq 'tag') {
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
368 my (undef, $name, $attrs, $body) = @{$el};
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
369
8
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
370 $s .= "<" . join(" ", $name, @{$attrs});
4
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
371 if ($body) {
8
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
372 $s .= ">" . format_tree($body, $indent + 1)
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
373 . "</$name>";
4
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
374 } else {
8
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
375 $s .= "/>";
4
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
376 }
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
377
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
378 next;
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
379 }
3
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
380
4
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
381 if ($tag =~ m/^X:(.*)/) {
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
382 my $name = "xsl:" . $1;
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
383 my (undef, @a) = @{$el};
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
384 my @attrs;
3
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
385
4
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
386 while (@a) {
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
387 last if ref($a[0]) eq 'ARRAY';
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
388 my $name = shift @a;
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
389 my $value = shift @a;
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
390 next unless defined $value;
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
391 $value = '"' . $value . '"'
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
392 unless $value =~ /^"/;
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
393 push @attrs, "$name=$value";
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
394 }
3
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
395
4
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
396 if ($name eq "xsl:stylesheet") {
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
397 push @attrs, 'xmlns:xsl="http://www.w3.org/1999/XSL/Transform"';
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
398 push @attrs, 'version="1.0"';
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
399 }
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
400
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
401 my ($attrs, $body) = @a;
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
402 $attrs = [ @{$attrs}, @attrs ];
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
403
8
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
404 $s .= "<" . join(" ", $name, @{$attrs});
4
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
405
5
2d6764d9980b XSLScript: various fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
406 if ($body && scalar @{$body} > 0) {
8
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
407 $s .= ">" . format_tree($body, $indent + 1)
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
408 . "</$name>";
4
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
409 } else {
8
86721b270ebb XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7
diff changeset
410 $s .= "/>";
4
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
411 }
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
412
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
413 next;
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
414 }
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
415
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
416 $s .= format_tree($el, $indent + 1);
3
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
417 }
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
418
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
419 return $s;
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
420 }
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
421
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
422 ###############################################################################
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
423
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
424 my $parser = Parse::RecDescent->new($grammar)
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
425 or die "Failed to create parser.\n";
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
426
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
427 my $lines;
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
428
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
429 {
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
430 local $/;
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
431 $lines = <>;
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
432 }
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
433
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
434 my $tree = $parser->startrule($lines)
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
435 or die "Failed to parse $ARGV.\n";
9
e93b6e98b817 XSLScript: -o option.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8
diff changeset
436 my $formatted = format_tree($tree);
e93b6e98b817 XSLScript: -o option.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8
diff changeset
437
e93b6e98b817 XSLScript: -o option.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8
diff changeset
438 if (defined $output) {
e93b6e98b817 XSLScript: -o option.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8
diff changeset
439 open STDOUT, ">", $output
e93b6e98b817 XSLScript: -o option.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8
diff changeset
440 or die "Can't open $output: $!\n";
e93b6e98b817 XSLScript: -o option.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8
diff changeset
441 }
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
442
7
9a283d72ddc3 XSLScript: --dump option.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
443 if ($dump) {
9a283d72ddc3 XSLScript: --dump option.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
444 print Dumper($tree);
9a283d72ddc3 XSLScript: --dump option.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
445 exit(0);
9a283d72ddc3 XSLScript: --dump option.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
446 }
9a283d72ddc3 XSLScript: --dump option.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
447
9
e93b6e98b817 XSLScript: -o option.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8
diff changeset
448 print $formatted;
4
eb959dce273b XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3
diff changeset
449
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
450 ###############################################################################