annotate xsls.pl @ 2:bcd96c403898

XSLScript: rewritten grammar, matches all xsls. While this grammar may be incomplete and/or incorrect in some cases, it is able to match all xsls files in nginx.org.
author Maxim Dounin <mdounin@mdounin.ru>
date Thu, 20 Feb 2014 07:38:58 +0400
parents f082f8c2ebb0
children 0fa786e03744
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
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
39 { $return = $item[1] }
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
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
42 | "!!" <commit> double_exclam
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 "%>"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
46 | "<" name attrs ">" <commit> item(s?) "</" name ">"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
47 | "<" <commit> name attrs "/" ">"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
48 | "X:variable" <commit> xvariable
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
49 | "X:var" <commit> xvariable
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
50 | "X:template" <commit> xtemplate
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
51 | "X:if" <commit> xif
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
52 | "X:param" <commit> xparam
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
53 | "X:for-each" <commit> xforeach
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
54 | "X:sort" <commit> xsort
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
55 | "X:when" <commit> xwhen
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
56 | "X:attribute" <commit> xattribute
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
57 | "X:output" <commit> xoutput
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
58 | "X:copy-of" <commit> xcopyof
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
59 | instruction <commit> attrs body
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
60 | text
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
61 | <error>
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
62
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
63 # list of simple instructions
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
64
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
65 instruction : "X:stylesheet"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
66 | "X:transform"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
67 | "X:attribute-set"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
68 | "X:element"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
69 | "X:apply-templates"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
70 | "X:choose"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
71 | "X:otherwise"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
72 | "X:value-of"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
73 | "X:apply-imports"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
74 | "X:number"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
75 | "X:include"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
76 | "X:import"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
77 | "X:strip-space"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
78 | "X:preserve-space"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
79 | "X:copy"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
80 | "X:text"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
81 | "X:comment"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
82 | "X:processing-instruction"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
83 | "X:decimal-format"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
84 | "X:namespace-alias"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
85 | "X:key"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
86 | "X:fallback"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
87 | "X:message"
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
88
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
89 # comments, <!-- ... -->
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
90 # not sure if it's something to be interpreted specially
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
91 # likely an artifact of our dump process
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
92
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
93 comment : /((?!-->).)*/ms "-->"
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
94 { $return = ""; 1; }
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
95
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
96 # special chars: ', ", {, }, \
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
97 # 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
98
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
99 text : quoted | unreserved | "'" | "\"" | "{"
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
100 quoted : "\\" special
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
101 { $return = $item{special}; 1; }
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
102 special : "'" | "\"" | "\\" | "{" | "}"
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
103 unreserved : /[^'"\\{}]/
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 # shortcuts:
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
106 #
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
107 # !{xpath-expression} for X:value-of select="xpath-expression";
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
108 # !! for X:apply-templates
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
109 # !foo() for X:call-template name="foo"
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
110
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
111 # !root (path = { !{ substring($DIRNAME, 2) } })
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
112 # !root (path = "substring-after($path, '/')")
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
113
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
114 double_exclam : value(?) params attrs ";"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
115
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
116 exclam_xpath : xpath(s?) "}"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
117 xpath : /[^}'"]+/
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
118 | /"[^"]*"/
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
119 | /'[^']*'/
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
120
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
121 exclam_name : params
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 # instruction attributes
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
124 # name="value"
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 attrs : attr(s?)
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
127 attr : name "=" value
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
128 name : /[a-z0-9_:-]+/i
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
129 value : /"[^"]*"/
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
130
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
131 # template parameters
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
132 # ( bar="init", baz={markup} )
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
133
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
134 params : "(" param ("," param)(s?) ")"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
135 | ""
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
136 param : name "=" value
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
137 | name "=" <commit> "{" item(s) "}"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
138 | name
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
139
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
140 # instruction body
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
141 # ";" for empty body, "{ ... }" otherwise
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
142
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
143 body : ";"
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
144 | "{" <commit> item(s?) "}"
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
145
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
146 # special handling of some instructions
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
147 # X:if attribute is test=
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
148
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
149 xif : value(?) attrs body "else" <commit> body
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
150 | value(?) attrs body
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
151 | <error>
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
152
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
153 # X:template name(params) = "match" {
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
154 # X:template name( bar="init", baz={markup} ) = "match" mode="some" {
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
155
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
156 xtemplate : name(?) params ( "=" value )(?)
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
157 attrs body
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
158
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
159 # X:var LINK = "/article/@link";
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
160 # X:var year = { ... }
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
161 # semicolon is optional
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
162
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
163 xvariable : name "=" value(?) attrs body
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
164 | name "=" value(?)
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
165 | <error>
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
166
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
167 # X:param XML = "'../xml'";
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
168 # X:param YEAR;
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
169
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
170 xparam : name ("=" value)(?) attrs body
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
171
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
172 # X:for-each "section[@id and @name]" { ... }
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
173 # X:for-each "link", X:sort "@id" {
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
174
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
175 xforeach : value attrs body
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
176 | value attrs "," "X:sort" <commit> value attrs body
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
177
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
178 # X:sort select
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
179 # X:sort "@id"
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 xsort : value attrs body
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 # X:when "position() = 1" { ... }
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
184
2
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
185 xwhen : value attrs body
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
186
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
187 # X:attribute "href" { ... }
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
188
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
189 xattribute : value attrs body
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
190
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
191 # X:output
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
192 # semicolon is optional
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
193
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
194 xoutput : attrs body
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
195 | attrs
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
196
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
197 # "X:copy-of"
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
198 # semicolon is optional
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
199
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
200 xcopyof : value attrs body
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
201 | value
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
202
bcd96c403898 XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
203 # eof
1
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
204
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
205 eofile : /^\Z/
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
206
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
207 EOF
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
208
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
209 ###############################################################################
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 my $parser = Parse::RecDescent->new($grammar)
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
212 or die "Failed to create parser.\n";
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
213
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
214 my $lines;
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
215
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
216 {
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
217 local $/;
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
218 $lines = <>;
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
219 }
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
220
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
221 my $tree = $parser->startrule($lines)
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
222 or die "Failed to parse $ARGV.\n";
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 print Dumper($tree);
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
225
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
226 ###############################################################################
f082f8c2ebb0 XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
227 ###############################################################################