Mercurial > hg > xslscript
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 |
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 ############################################################################### |