annotate xsls.pl @ 3:0fa786e03744

XSLScript: some preliminary work on conversion. The aproach seems to be wrong though, it looks like the only correct way is to build a tree, and then process the tree. Major changes expected.
author Maxim Dounin <mdounin@mdounin.ru>
date Thu, 20 Feb 2014 19:16:42 +0400
parents bcd96c403898
children eb959dce273b
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
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
5 # Convert from XSLScript to XSLT.
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
6 #
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
7 # Originally XSLScript was written by Paul Tchistopolskii. It is believed
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
8 # 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
9 # implementation has major Java dependency, no longer supported and hard
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
10 # to find.
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
11 #
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
12 # 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
13 # to provide functionality needed for nginx documentation.
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
14
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 use warnings;
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
18 use strict;
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
19
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
20 use Parse::RecDescent;
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
21 use Getopt::Long;
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
22 use Data::Dumper qw/Dumper/;
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
23
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 GetOptions(
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
27 "trace!" => \$::RD_TRACE,
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
28 "hint!" => \$::RD_HINT,
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
29 )
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
30 or die "oops\n";
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
31
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
32 ###############################################################################
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
33
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
34 my $grammar = <<'EOF';
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 # XSLTScript grammar, reconstructed
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 startrule : item(s) eofile
3
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
39 { $return = $item[1]; 1 }
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
40
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
41 item : "<!--" <commit> comment
3
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
42 | "!!" <commit> exclam_double
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
43 | "!{" <commit> exclam_xpath
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
44 | "!" name <commit> exclam_name
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
45 | "<%" <commit> instruction "%>"
3
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
46 { $return = $item{instruction}; 1 }
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
47 | "<" name attrs ">" <commit> item(s?) "</" name ">"
3
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
48 { $return = ::format_tag($item{name}, $item{attrs}, $item[6]); 1 }
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
49 | "<" <commit> name attrs "/" ">"
3
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
50 { $return = ::format_tag($item{name}, $item{attrs}); 1 }
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
51 | "X:variable" <commit> xvariable
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
52 | "X:var" <commit> xvariable
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
53 | "X:template" <commit> xtemplate
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
54 | "X:if" <commit> xif
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
55 | "X:param" <commit> xparam
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
56 | "X:for-each" <commit> xforeach
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
57 | "X:sort" <commit> xsort
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
58 | "X:when" <commit> xwhen
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
59 | "X:attribute" <commit> xattribute
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
60 | "X:output" <commit> xoutput
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
61 | "X:copy-of" <commit> xcopyof
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
62 | instruction <commit> attrs body
3
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
63 { $return = ::format_instruction(
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
64 $item{instruction}, $item{attrs}, $item{body});
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
65 1 }
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
66 | text
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
67 | <error>
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
68
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
69 # list of simple instructions
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
70
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
71 instruction : "X:stylesheet"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
72 | "X:transform"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
73 | "X:attribute-set"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
74 | "X:element"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
75 | "X:apply-templates"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
76 | "X:choose"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
77 | "X:otherwise"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
78 | "X:value-of"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
79 | "X:apply-imports"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
80 | "X:number"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
81 | "X:include"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
82 | "X:import"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
83 | "X:strip-space"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
84 | "X:preserve-space"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
85 | "X:copy"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
86 | "X:text"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
87 | "X:comment"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
88 | "X:processing-instruction"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
89 | "X:decimal-format"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
90 | "X:namespace-alias"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
91 | "X:key"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
92 | "X:fallback"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
93 | "X:message"
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
94
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
95 # comments, <!-- ... -->
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
96 # not sure if it's something to be interpreted specially
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
97 # likely an artifact of our dump process
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
98
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
99 comment : /((?!-->).)*/ms "-->"
3
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
100 { $return = "<!-- " . $item[1] . "-->"; 1; }
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
101
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
102 # special chars: ', ", {, }, \
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
103 # 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
104
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
105 text : quoted | unreserved | "'" | "\"" | "{"
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
106 quoted : "\\" special
3
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
107 { $return = $item{special}; 1; }
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
108 special : "'" | "\"" | "\\" | "{" | "}"
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
109 unreserved : /[^'"\\{}]/
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
110
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
111 # shortcuts:
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
112 #
3
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
113 # !! for X:apply-templates
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
114 # !{xpath-expression} for X:value-of select="xpath-expression";
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
115 # !foo() for X:call-template name="foo"
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
116
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
117 # !root (path = { !{ substring($DIRNAME, 2) } })
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
118 # !root (path = "substring-after($path, '/')")
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
119
3
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
120 exclam_double : value(?) params(?) attrs ";"
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
121 { $return = ::format_apply($item{value}, $item{params}, $item{attrs}); 1 }
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
122
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
123 exclam_xpath : xpath(s?) "}"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
124 xpath : /[^}'"]+/
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
125 | /"[^"]*"/
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
126 | /'[^']*'/
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
127
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
128 exclam_name : params
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
129
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
130 # instruction attributes
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
131 # name="value"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
132
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
133 attrs : attr(s?)
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
134 attr : name "=" value
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
135 name : /[a-z0-9_:-]+/i
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
136 value : /"[^"]*"/
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
137
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
138 # template parameters
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
139 # ( bar="init", baz={markup} )
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
140
3
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
141 params : "(" param(s /,/) ")"
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
142 { $return = $item[2]; 1 }
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
143 param : name "=" value
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
144 | name "=" <commit> "{" item(s) "}"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
145 | name
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
146
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
147 # instruction body
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
148 # ";" for empty body, "{ ... }" otherwise
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
149
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
150 body : ";"
3
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
151 { $return = ""; }
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
152 | "{" <commit> item(s?) "}"
3
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
153 { $return = join("\n", @{$item[3]}); 1 }
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
154
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
155 # special handling of some instructions
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
156 # X:if attribute is test=
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
157
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
158 xif : value(?) attrs body "else" <commit> body
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
159 | value(?) attrs body
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
160 | <error>
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
161
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
162 # X:template name(params) = "match" {
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
163 # X:template name( bar="init", baz={markup} ) = "match" mode="some" {
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
164
3
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
165 xtemplate : name(?) params(?) ( "=" value )(?)
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
166 attrs body
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
167
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
168 # X:var LINK = "/article/@link";
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
169 # X:var year = { ... }
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
170 # semicolon is optional
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
171
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
172 xvariable : name "=" value(?) attrs body
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
173 | name "=" value(?)
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
174 | <error>
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
175
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
176 # X:param XML = "'../xml'";
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
177 # X:param YEAR;
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
178
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
179 xparam : name ("=" value)(?) attrs body
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
180
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
181 # X:for-each "section[@id and @name]" { ... }
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
182 # X:for-each "link", X:sort "@id" {
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
183
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
184 xforeach : value attrs body
3
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
185 { $return = ::format_instruction_value(
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
186 "X:for-each", "select", $item{value}, $item{attrs}, $item{body});
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
187 1 }
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
188 | value attrs "," "X:sort" <commit> value attrs body
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
189
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
190 # X:sort select
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
191 # X:sort "@id"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
192
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
193 xsort : value attrs body
3
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
194 { $return = ::format_instruction_value(
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
195 "X:sort", "select", $item{value}, $item{attrs}, $item{body});
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
196 1 }
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
197
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
198 # X:when "position() = 1" { ... }
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
199
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
200 xwhen : value attrs body
3
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
201 { $return = ::format_instruction_value(
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
202 "X:when", "test", $item{value}, $item{attrs}, $item{body});
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
203 1 }
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
204
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
205 # X:attribute "href" { ... }
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
206
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
207 xattribute : value attrs body
3
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
208 { $return = ::format_instruction_value(
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
209 "X:attribute", "name", $item{value}, $item{attrs}, $item{body});
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
210 1 }
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
211
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
212 # X:output
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
213 # semicolon is optional
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
214
3
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
215 xoutput : attrs body(?)
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
216 { $return = ::format_instruction(
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
217 "X:output", $item{attrs}, $item{body});
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
218 1 }
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
219
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
220 # "X:copy-of"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
221 # semicolon is optional
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
222
3
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
223 xcopyof : value attrs body(?)
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
224 { $return = ::format_instruction_value(
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
225 "X:copy-of", "select", $item{value}, $item{attrs}, $item{body});
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
226 1 }
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
227
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
228 # eof
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
229
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
230 eofile : /^\Z/
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
231
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
232 EOF
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
233
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
234 ###############################################################################
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
235
3
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
236 # helper formatting functions, used by grammar
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
237
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
238 sub format_instruction {
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
239 my ($instruction, $attrs, $body) = @_;
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
240 my $s = "<";
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
241
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
242 $instruction =~ s/^X:/xsl:/;
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
243
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
244 $s .= join(" ", $instruction, @{$attrs});
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
245
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
246 if ($body) {
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
247 $s .= ">\n" . $body . "\n</" . $instruction . ">\n";
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
248 } else {
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
249 $s .= "/>\n";
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
250 }
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
251
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
252 return $s;
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
253 }
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
254
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
255 sub format_instruction_value {
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
256 my ($instruction, $name, $value, $attrs, $body) = @_;
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
257 my $s = "<";
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
258
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
259 if ($value) {
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
260 push(@{$attrs}, "$name=$value");
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
261 }
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
262
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
263 return format_instruction($instruction, $attrs, $body);
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
264 }
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
265
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
266 sub format_tag {
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
267 my ($tag, $attrs, $body) = @_;
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
268 my $s = "\n<";
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
269
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
270 $s .= join(" ", $tag, @{$attrs});
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
271
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
272 $body = join("\n", @{$body});
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
273
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
274 if ($body) {
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
275 $s .= ">" . $body . "\n</" . $tag . ">\n";
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
276 } else {
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
277 $s .= "/>\n";
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
278 }
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
279
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
280 return $s;
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
281 }
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
282
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
283 sub format_apply {
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
284 my ($select, $params, $attrs) = @_;
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
285 my $s = "\n<";
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
286 my $tag = "xsl:apply-templates";
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
287
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
288 if ($select) {
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
289 unshift "select=$select", @{$attrs};
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
290 }
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
291
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
292 $s .= join(" ", $tag, @{$attrs});
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
293
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
294 if ($params) {
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
295 $params = join("\n", @{$params});
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
296 $s .= ">\n" . $params . "\n</" . $tag . ">\n";
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
297 } else {
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
298 $s .= "/>\n";
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
299 }
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
300 }
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
301
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
302 ###############################################################################
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
303
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
304 my $parser = Parse::RecDescent->new($grammar)
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
305 or die "Failed to create parser.\n";
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
306
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
307 my $lines;
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
308
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
309 {
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
310 local $/;
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
311 $lines = <>;
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
312 }
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
313
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
314 my $tree = $parser->startrule($lines)
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
315 or die "Failed to parse $ARGV.\n";
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
316
3
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
317 #print Dumper($tree);
0fa786e03744 XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2
diff changeset
318 #print join("\n", @{$tree});
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
319
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
320 ###############################################################################
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
321 ###############################################################################