]> matita.cs.unibo.it Git - helm.git/blob - helm/www/lambdadelta/bin/xhtbl/textParser.mly
- xhtbl: support for relative links added
[helm.git] / helm / www / lambdadelta / bin / xhtbl / textParser.mly
1 %{
2
3 module S = Str
4 module L = List
5 module T = Table
6
7 let split s =
8    S.split (S.regexp "[ \r\n\t]+") s
9
10 let mk_css_atom s rs =
11    let cs = split s in
12    let map (b, (x1, x2)) = cs, b, x1, x2 in 
13    L.map map rs
14
15 let mk_string_atom s rs =
16    let map (b, (x1, x2)) = s, b, x1, x2 in 
17    L.map map rs
18
19 %}
20
21 %token <int> NUM
22 %token <string> TEXT 
23 %token SPACE NAME TABLE CSS URI EXT SR OC CC OB CB PS OP CP AT EOF
24
25 %start script
26 %type <(string * string) list * (string * Table.table * Table.css Attr.atoms * Table.uri Attr.atoms * Table.ext Attr.atoms) list> script
27
28 %%
29
30 space:
31    | SPACE TEXT TEXT { $2, $3 }
32 ;
33
34 spaces:
35    |              { []       }
36    | space spaces { $1 :: $2 }
37 ;
38
39 text:
40    | TEXT                  { T.Plain $1             }
41    | AT OP TEXT TEXT CP    { T.Link (true, $3, $4)  }
42    | AT AT OP TEXT TEXT CP { T.Link (false, $4, $5) }
43    | AT TEXT               { T.Link (true, $2, $2)  }
44    | AT AT TEXT            { T.Link (false, $3, $3) }   
45 ;
46
47 texts:
48   | text          { [$1]     }
49   | text PS texts { $1 :: $3 }
50 ;
51
52 key:
53    | texts { T.Text $1        }
54    | SR    { T.Glue None      }
55    | NUM   { T.Glue (Some $1) }
56 ;
57
58 css:
59    |          { []       }
60    | CSS TEXT { split $2 }
61 ;
62
63 uri:
64    |          { "" }
65    | URI TEXT { $2 }
66 ;
67
68 ext:
69    |          { "" }
70    | EXT TEXT { $2 }
71 ;
72
73 table:
74    | css uri ext key          { T.mk_key        $4 $1 $2 $3 }
75    | css uri ext OC tables CC { T.mk_line false $5 $1 $2 $3 }
76    | css uri ext OB tables CB { T.mk_line true  $5 $1 $2 $3 }
77 ;
78
79 tables:
80    |              { []       }
81    | table tables { $1 :: $2 }
82 ;
83
84 name:
85    |           { "" }
86    | NAME TEXT { $2 }
87 ;
88
89 interval:
90    | NUM     { Some $1, Some $1 }
91    | SR      { None, None       } 
92    | NUM NUM { Some $1, Some $2 }
93    | NUM SR  { Some $1, None    }
94    | SR NUM  { None, Some $2    }
95    | SR SR   { None, None       }
96 ;
97
98 range:
99    | OB interval CB { true, $2  }
100    | OC interval CC { false, $2 }
101 ;
102
103 ranges:
104    |              { []       }
105    | range ranges { $1 :: $2 }
106 ;
107
108 catom:
109    | CSS TEXT ranges { mk_css_atom $2 $3 }
110 ;
111
112 catoms:
113    |              { []      }
114    | catom catoms { $1 @ $2 }
115 ;
116
117 uatom:
118    | URI TEXT ranges { mk_string_atom $2 $3 }
119 ;
120
121 uatoms:
122    |              { []      }
123    | uatom uatoms { $1 @ $2 }
124 ;
125
126 xatom:
127    | EXT TEXT ranges { mk_string_atom $2 $3 }
128 ;
129
130 xatoms:
131    |              { []      }
132    | xatom xatoms { $1 @ $2 }
133 ;
134
135 directive:
136    | name TABLE table catoms uatoms xatoms { $1, $3, $4, $5, $6 }
137 ;
138
139 directives:
140    |                      { []       }
141    | directive directives { $1 :: $2 }
142 ;
143
144 script:
145    | spaces directives EOF { $1, $2 }
146 ;