Project

General

Profile

Element Expression » History » Version 1

Robert Bossy, 08/23/2011 04:03 PM

1 1 Robert Bossy
{{toc}}
2 1 Robert Bossy
3 1 Robert Bossy
h1. Introduction
4 1 Robert Bossy
5 1 Robert Bossy
Element Expressions is a language for exploring and querying the AlvisNLP Corpus. It can be used to test features, count elements, retrieve annotations with certain characteristics, etc. This language shares a lot of common points 
6 1 Robert Bossy
7 1 Robert Bossy
8 1 Robert Bossy
h1. Context Element
9 1 Robert Bossy
10 1 Robert Bossy
Expressions are evaluated within a context that includes an element. The context element can be one of the following:
11 1 Robert Bossy
* the corpus
12 1 Robert Bossy
* a document
13 1 Robert Bossy
* a section
14 1 Robert Bossy
* an annotation
15 1 Robert Bossy
* a relation
16 1 Robert Bossy
* a tuple
17 1 Robert Bossy
18 1 Robert Bossy
Some expressions are independent of the context element; their evaluation does not depend on it (for instance arithmetic operators). However the most useful expressions depend on the context element, for instance the evaluation of a feature value expression obviously depends on the context element. Wherever an expression is expected, for instance as a module parameter, the context element sould be documented.
19 1 Robert Bossy
20 1 Robert Bossy
h1. Evaluation types
21 1 Robert Bossy
22 1 Robert Bossy
An expression can be evaluated as on of four types: boolean, number, string or element list. The evaluation type should be documented along with the context element.
23 1 Robert Bossy
24 1 Robert Bossy
h2. Scalar types
25 1 Robert Bossy
26 1 Robert Bossy
h3. Boolean
27 1 Robert Bossy
28 1 Robert Bossy
The boolean type has two values: @false@ and @true@.
29 1 Robert Bossy
30 1 Robert Bossy
h3. Number
31 1 Robert Bossy
32 1 Robert Bossy
The number type is a double precision 64-bit floating point number (Java @double@).
33 1 Robert Bossy
34 1 Robert Bossy
h3. String
35 1 Robert Bossy
36 1 Robert Bossy
The string type is a 16-bit unicode character sequence (Java @String@).
37 1 Robert Bossy
38 1 Robert Bossy
h2. Element list
39 1 Robert Bossy
40 1 Robert Bossy
The element list type is an ordered collection of elements. In most cases elements in an element list are of the same type (all Annotations or all Documents etc.).
41 1 Robert Bossy
42 1 Robert Bossy
h2. Type coercion
43 1 Robert Bossy
44 1 Robert Bossy
The majority of expressions have a priviledged or primary evaluation type, however they can be evaluated into another type. The value is computed using type coercion rules:
45 1 Robert Bossy
46 1 Robert Bossy
|       |*boolean*|*number*|*string*|*list*|
47 1 Robert Bossy
|*boolean*||false=0, true=1|false="false", true="true"|empty list|
48 1 Robert Bossy
|*number* |0=false, otherwise true||decimal notation string|empty list|
49 1 Robert Bossy
|*string* |""=false, otherwise true|decimal conversion||empty list|
50 1 Robert Bossy
|*list*   |empty=false, otherwise true|element count|concatenation of static features||
51 1 Robert Bossy
52 1 Robert Bossy
Some expressions have specific coercion rules.
53 1 Robert Bossy
54 1 Robert Bossy
h1. Operator precedence and associativity
55 1 Robert Bossy
56 1 Robert Bossy
The following operators are listed in descending order of precedence. The precedence can be overriden with parentheses.
57 1 Robert Bossy
58 1 Robert Bossy
|*Operators*|*Associative*|
59 1 Robert Bossy
|@if then else@|no|
60 1 Robert Bossy
|@or@|yes|
61 1 Robert Bossy
|@and@|yes|
62 1 Robert Bossy
|@not@|no|
63 1 Robert Bossy
|@== != < > <= >= ?= ^= =^ =~ in any@|no|
64 1 Robert Bossy
|@^@|yes|
65 1 Robert Bossy
|@+ -@|yes|
66 1 Robert Bossy
|@* / %@|yes|
67 1 Robert Bossy
|unary @-@|no|
68 1 Robert Bossy
|pipe|yes|
69 1 Robert Bossy
|@.@|yes|
70 1 Robert Bossy
71 1 Robert Bossy
h1. Syntax for names
72 1 Robert Bossy
73 1 Robert Bossy
Some expressions require a name (feature key or layer name for instance). Names are single quote character sequences. The quotes can be omitted if all the following conditions are met:
74 1 Robert Bossy
* all characters are alphabetic (@A-Za-z@) or undescore (@_@)
75 1 Robert Bossy
* the name is different from any reserved word:
76 1 Robert Bossy
|@after@|
77 1 Robert Bossy
|@and@|
78 1 Robert Bossy
|@any@|
79 1 Robert Bossy
|@args@|
80 1 Robert Bossy
|@before@|
81 1 Robert Bossy
|@boolean@|
82 1 Robert Bossy
|@contents@|
83 1 Robert Bossy
|@corpus@|
84 1 Robert Bossy
|@document@|
85 1 Robert Bossy
|@documents@|
86 1 Robert Bossy
|@elements@|
87 1 Robert Bossy
|@else@|
88 1 Robert Bossy
|@end@|
89 1 Robert Bossy
|@false@|
90 1 Robert Bossy
|@if@|
91 1 Robert Bossy
|@in@|
92 1 Robert Bossy
|@inside@|
93 1 Robert Bossy
|@layer@|
94 1 Robert Bossy
|@length@|
95 1 Robert Bossy
|@not@|
96 1 Robert Bossy
|@number@|
97 1 Robert Bossy
|@or@|
98 1 Robert Bossy
|@outside@|
99 1 Robert Bossy
|@overlapping@|
100 1 Robert Bossy
|@relation@|
101 1 Robert Bossy
|@relations@|
102 1 Robert Bossy
|@section@|
103 1 Robert Bossy
|@sections@|
104 1 Robert Bossy
|@start@|
105 1 Robert Bossy
|@string@|
106 1 Robert Bossy
|@then@|
107 1 Robert Bossy
|@true@|
108 1 Robert Bossy
|@tuples@|
109 1 Robert Bossy
110 1 Robert Bossy
111 1 Robert Bossy
112 1 Robert Bossy
h1. Expression reference
113 1 Robert Bossy
114 1 Robert Bossy
h3. Boolean constants
115 1 Robert Bossy
116 1 Robert Bossy
<pre>
117 1 Robert Bossy
  false
118 1 Robert Bossy
  true
119 1 Robert Bossy
</pre>
120 1 Robert Bossy
121 1 Robert Bossy
h3. Integer constants
122 1 Robert Bossy
123 1 Robert Bossy
<pre>
124 1 Robert Bossy
  [0-9]+
125 1 Robert Bossy
</pre>
126 1 Robert Bossy
127 1 Robert Bossy
h3. String constants
128 1 Robert Bossy
129 1 Robert Bossy
String constants are double quoted character sequences. The usual Java escape sequences apply.
130 1 Robert Bossy
131 1 Robert Bossy
h3. Boolean operators [boolean]
132 1 Robert Bossy
133 1 Robert Bossy
<pre>
134 1 Robert Bossy
  LEFT and RIGHT
135 1 Robert Bossy
  LEFT or RIGHT
136 1 Robert Bossy
  not EXPR
137 1 Robert Bossy
</pre>
138 1 Robert Bossy
139 1 Robert Bossy
@LEFT@, @RIGHT@ and @EXPR@ are evaluated as booleans with the same context element.
140 1 Robert Bossy
Binary boolean operator evaluation is short-circuited.
141 1 Robert Bossy
142 1 Robert Bossy
h3. General comparison [boolean]
143 1 Robert Bossy
144 1 Robert Bossy
<pre>
145 1 Robert Bossy
  LEFT == RIGHT
146 1 Robert Bossy
  LEFT != RIGHT
147 1 Robert Bossy
</pre>
148 1 Robert Bossy
149 1 Robert Bossy
@LEFT@ and @RIGHT@ are evaluated as the same type with the same context element. If @LEFT@ is an expression of scalar type, then its type is used. Otherwise, the type of @RIGHT@ is used.
150 1 Robert Bossy
151 1 Robert Bossy
h3. Integer comparison [boolean]
152 1 Robert Bossy
153 1 Robert Bossy
<pre>
154 1 Robert Bossy
  LEFT < RIGHT
155 1 Robert Bossy
  LEFT > RIGHT
156 1 Robert Bossy
  LEFT <= RIGHT
157 1 Robert Bossy
  LEFT >= RIGHT
158 1 Robert Bossy
</pre>
159 1 Robert Bossy
160 1 Robert Bossy
@LEFT@ and @RIGHT@ are evaluated as numbers using the same context element.
161 1 Robert Bossy
162 1 Robert Bossy
h3. String comparison [boolean]
163 1 Robert Bossy
164 1 Robert Bossy
<pre>
165 1 Robert Bossy
  LEFT ?= RIGHT
166 1 Robert Bossy
  LEFT ^= RIGHT
167 1 Robert Bossy
  LEFT =^ RIGHT
168 1 Robert Bossy
</pre>
169 1 Robert Bossy
170 1 Robert Bossy
@LEFT@ and @RIGHT@ are evaluated as strings using the same context element.
171 1 Robert Bossy
Meaning of operators:
172 1 Robert Bossy
|@?=@|contains|
173 1 Robert Bossy
|@^=@|starts with|
174 1 Robert Bossy
|@=^@|ends with|
175 1 Robert Bossy
176 1 Robert Bossy
h3. String concatenation [string]
177 1 Robert Bossy
178 1 Robert Bossy
<pre>
179 1 Robert Bossy
  LEFT ^ RIGHT
180 1 Robert Bossy
</pre>
181 1 Robert Bossy
182 1 Robert Bossy
@LEFT@ and @RIGHT@ are evaluated as strings with the same context element.
183 1 Robert Bossy
184 1 Robert Bossy
h3. Regexp match
185 1 Robert Bossy
186 1 Robert Bossy
<pre>
187 1 Robert Bossy
  TARGET =~ "PATTERN"
188 1 Robert Bossy
</pre>
189 1 Robert Bossy
190 1 Robert Bossy
@TARGET@ is evaluated as a string with the same context element. @"PATTERN"@ is a string constant containing a regular expression in "Java syntax":http://download.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html
191 1 Robert Bossy
If evaluated as a boolean, then this expression returns either the target matches the pattern.
192 1 Robert Bossy
If evaluated as a number, then this expression returns the number of non-overlapping matches of the pattern in the target.
193 1 Robert Bossy
If evaluated as a string, then this expression returns the first match of the pattern in the target.
194 1 Robert Bossy
If evaluated as an element list, then this expression returns an empty list.
195 1 Robert Bossy
196 1 Robert Bossy
h3. Arithmetic [number]
197 1 Robert Bossy
198 1 Robert Bossy
<pre>
199 1 Robert Bossy
  LEFT + RIGHT
200 1 Robert Bossy
  LEFT - RIGHT
201 1 Robert Bossy
  LEFT * RIGHT
202 1 Robert Bossy
  LEFT / RIGHT
203 1 Robert Bossy
  LEFT % RIGHT
204 1 Robert Bossy
</pre>
205 1 Robert Bossy
206 1 Robert Bossy
@LEFT@ and @RIGHT@ are both evaluated as numbers with the same context element.
207 1 Robert Bossy
208 1 Robert Bossy
h3. Unary minus [number]
209 1 Robert Bossy
210 1 Robert Bossy
<pre>
211 1 Robert Bossy
  - EXPR
212 1 Robert Bossy
</pre>
213 1 Robert Bossy
214 1 Robert Bossy
@EXPR@ is evaluated as a number with the same context element.
215 1 Robert Bossy
216 1 Robert Bossy
h3. Dictionary lookup [boolean]
217 1 Robert Bossy
218 1 Robert Bossy
<pre>
219 1 Robert Bossy
  EXPR in "FILE"[:"ENCODING"]
220 1 Robert Bossy
</pre>
221 1 Robert Bossy
222 1 Robert Bossy
@EXPR@ is evaluated as a string with the same context element. @"FILE"@ is a string constant containg the path to a dictionary file. @"ENCODING"@ is a string constant containing the name of the dictionary file character set. If the encoding is omitted, UTF-8 is assumed.
223 1 Robert Bossy
The dictionary file must contain one entry per line. This expression returns true if and only if the dictionary contains the first operand.
224 1 Robert Bossy
225 1 Robert Bossy
h3. Feature
226 1 Robert Bossy
227 1 Robert Bossy
<pre>
228 1 Robert Bossy
  KEY
229 1 Robert Bossy
</pre>
230 1 Robert Bossy
231 1 Robert Bossy
@KEY@ is a name. This expression returns the last value of the feature with key @KEY@ of context element.
232 1 Robert Bossy
If this expression is evaluated as a boolean, then it returns @true@ if and only if the context element has a feature with key @KEY@, +even if the feature value is an empty string+.
233 1 Robert Bossy
234 1 Robert Bossy
h3. Any feature value equals
235 1 Robert Bossy
236 1 Robert Bossy
<pre>
237 1 Robert Bossy
  any @KEY@ == @EXPR@
238 1 Robert Bossy
</pre>
239 1 Robert Bossy
240 1 Robert Bossy
@KEY@ is a name. @EXPR@ is evaluated as a string with the same context element.
241 1 Robert Bossy
This expression returns true if at least one of the values of the feature with key @KEY@ in the context element equals @EXPR@.
242 1 Robert Bossy
243 1 Robert Bossy
h3. Annotation positions [number]
244 1 Robert Bossy
245 1 Robert Bossy
<pre>
246 1 Robert Bossy
  start
247 1 Robert Bossy
  end
248 1 Robert Bossy
</pre>
249 1 Robert Bossy
250 1 Robert Bossy
These expressions return the start or end position if the context element is an annotation. Otherwise it returns @0@.
251 1 Robert Bossy
252 1 Robert Bossy
h3. Element length [number]
253 1 Robert Bossy
254 1 Robert Bossy
<pre>
255 1 Robert Bossy
  length
256 1 Robert Bossy
</pre>
257 1 Robert Bossy
258 1 Robert Bossy
If the context element is an annotation, then this expression returns its length.
259 1 Robert Bossy
If the context element is a section, then this expression returns returns the length of the section's contents.
260 1 Robert Bossy
261 1 Robert Bossy
h3. Reference
262 1 Robert Bossy
263 1 Robert Bossy
<pre>
264 1 Robert Bossy
  $REF
265 1 Robert Bossy
</pre>
266 1 Robert Bossy
267 1 Robert Bossy
@REF@ is a name. This expression returns the value of the named reference.
268 1 Robert Bossy
Available references should be documented by the module.
269 1 Robert Bossy
270 1 Robert Bossy
h3. Section contents [string]
271 1 Robert Bossy
272 1 Robert Bossy
<pre>
273 1 Robert Bossy
  contents
274 1 Robert Bossy
</pre>
275 1 Robert Bossy
276 1 Robert Bossy
If the context element is a section, then this expression returns its contents. Otherwise the empty string is returned.
277 1 Robert Bossy
278 1 Robert Bossy
h3. Conditional
279 1 Robert Bossy
280 1 Robert Bossy
<pre>
281 1 Robert Bossy
  if CONDITION then TRUE else TRUE
282 1 Robert Bossy
</pre>
283 1 Robert Bossy
284 1 Robert Bossy
@CONDITION@ is evaluated as a boolean with the same context element. If the result is, then @TRUE@ is evaluated as the same type with the same context element. Otherwise @FALSE@ is evaluated as the same type with the same context element.
285 1 Robert Bossy
286 1 Robert Bossy
h3. Union [list]
287 1 Robert Bossy
288 1 Robert Bossy
<pre>
289 1 Robert Bossy
  LEFT | RIGHT
290 1 Robert Bossy
</pre>
291 1 Robert Bossy
292 1 Robert Bossy
@LEFT@ and @RIGHT@ are evaluated as element lists with the same context element. This expression returns the concatenation of the two results.
293 1 Robert Bossy
Elements in the result list are not reordered. Duplicate lements remain.
294 1 Robert Bossy
295 1 Robert Bossy
h3. Path
296 1 Robert Bossy
297 1 Robert Bossy
<pre>
298 1 Robert Bossy
  LEFT . RIGHT
299 1 Robert Bossy
</pre>
300 1 Robert Bossy
301 1 Robert Bossy
@LEFT@ is evaluated as an element list with the same context element, then each element of the result is used as the context element to evaluate @RIGHT@.
302 1 Robert Bossy
If this expression is evaluated as a boolean, then it retuns @true@ if any evaluation of @RIGHT@ as a boolean is true.
303 1 Robert Bossy
If this expression is evaluated as a number, then it returns the sum of all successive evaluations of @RIGHT@ as a number.
304 1 Robert Bossy
If this expression is evaluated as a string, then it returns the concatenation of all successive evaluations of @RIGHT@ as a string.
305 1 Robert Bossy
If this expression is evaluated as a list, then it returns the concatenation of all successive evaluations of @RIGHT@ as a list.
306 1 Robert Bossy
307 1 Robert Bossy
h2. Element navigation expressions [list]
308 1 Robert Bossy
309 1 Robert Bossy
Element navigation expressions returns elements according to a navigation specification. The following subsections describe each available specification.
310 1 Robert Bossy
A specification can be followed by filters and ranges. The order of filter and ranges specifies the order in which they are applied. If a range follows a filter, then range is applied after the filter.
311 1 Robert Bossy
312 1 Robert Bossy
h3. Filters
313 1 Robert Bossy
314 1 Robert Bossy
<pre>
315 1 Robert Bossy
  SPEC ( EXPR )
316 1 Robert Bossy
</pre>
317 1 Robert Bossy
318 1 Robert Bossy
@SPEC@ is a navigation specification. @EXPR@ is evaluated as a boolean with the current element as the context element.
319 1 Robert Bossy
The expression returns the list of elements for which @EXPR@ was evaluated as @true@.
320 1 Robert Bossy
321 1 Robert Bossy
h3. Ranges
322 1 Robert Bossy
323 1 Robert Bossy
<pre>
324 1 Robert Bossy
  SPEC ( N )
325 1 Robert Bossy
  SPEC ( N : M)
326 1 Robert Bossy
  SPEC ( : M )
327 1 Robert Bossy
  SPEC ( N : )
328 1 Robert Bossy
</pre>
329 1 Robert Bossy
330 1 Robert Bossy
@SPEC@ is a navigation specification. @N@ and @M@ are integer constants.
331 1 Robert Bossy
The returned list is a sublist of the list returned by @SPEC@:
332 1 Robert Bossy
|@N@|a singleton list with the @N@th element|
333 1 Robert Bossy
|@N : M@|the sublist from the @N@th (inclusive) to the @M@th (exclusive) elements|
334 1 Robert Bossy
|@: M@|the sublist from the start to the @M@th element (exlusive)|
335 1 Robert Bossy
|@N :@|the sublist from the @N@th element (inclusive) to the end|
336 1 Robert Bossy
List indexes are zero-based: @0@ is the first, @1@ is the second, etc. If @N@ or @M@ are negative, then the length of the list + 1 is added to their value: @-1@ is the last (inclusive).
337 1 Robert Bossy
If the indexes are out of the list boundaries then the index is "cropped".
338 1 Robert Bossy
339 1 Robert Bossy
h3. Element corpus
340 1 Robert Bossy
341 1 Robert Bossy
<pre>
342 1 Robert Bossy
  corpus
343 1 Robert Bossy
</pre>
344 1 Robert Bossy
345 1 Robert Bossy
This expression returns the currently annotated corpus.
346 1 Robert Bossy
347 1 Robert Bossy
h3. Corpus documents
348 1 Robert Bossy
349 1 Robert Bossy
<pre>
350 1 Robert Bossy
  documents [ : ID ]
351 1 Robert Bossy
</pre>
352 1 Robert Bossy
353 1 Robert Bossy
@ID@ is a name. If the context element is the corpus, then this expression returns a singleton list containing the document with the identifier @ID@. If @ID@ is omitted, then this expression returns a list containing all documents in the corpus.
354 1 Robert Bossy
If the context element is not the corpus, or there is no document in the corpus, or there is no document with the specified identifier, then this expression returns the empty list.
355 1 Robert Bossy
356 1 Robert Bossy
h3. Document sections
357 1 Robert Bossy
358 1 Robert Bossy
<pre>
359 1 Robert Bossy
  sections [ : NAME ]
360 1 Robert Bossy
</pre>
361 1 Robert Bossy
362 1 Robert Bossy
@NAME@ is a name. If the context element is a document, then this expression returns a list containing all sections in the document with the name @NAME@. If @NAME@ is omitted, then this expression returns all sections of the document.
363 1 Robert Bossy
If the context element is not a document, or there is no section in the document, or there is no section with the specified name, then this expression returns the empty list.
364 1 Robert Bossy
365 1 Robert Bossy
h3. Section annotations
366 1 Robert Bossy
367 1 Robert Bossy
<pre>
368 1 Robert Bossy
  layer [ : NAME ]
369 1 Robert Bossy
</pre>
370 1 Robert Bossy
371 1 Robert Bossy
@NAME@ is a name. If the context element is a section, then this expression returns a list containing all annotations in the layer named @NAME@. If @NAME@ is omitted, then this expression returns all annotations of all layers of the section.
372 1 Robert Bossy
If the context element is not a section, or there is no layer with the specified name, or there is no annotation in the section, or the layer with the specified name is empty, then this expression returns the empty list.
373 1 Robert Bossy
374 1 Robert Bossy
In all cases, the list of annotations is sorted by standard order (increasing start, then decreasing end) and duplicates are removed.
375 1 Robert Bossy
376 1 Robert Bossy
h3. Section relations
377 1 Robert Bossy
378 1 Robert Bossy
<pre>
379 1 Robert Bossy
  relations [ : NAME ]
380 1 Robert Bossy
</pre>
381 1 Robert Bossy
382 1 Robert Bossy
@NAME@ is a name. If the context element is a section, then this expression returns a singleton list containing the relation in the section with the name @NAME@. If @NAME@ is omitted, then this expression returns all relations of the section.
383 1 Robert Bossy
If the context element is not a section, or there is no relation in the section, or there is no relation with the specified name, then this expression returns the empty list.
384 1 Robert Bossy
385 1 Robert Bossy
h3. Relation tuples
386 1 Robert Bossy
387 1 Robert Bossy
<pre>
388 1 Robert Bossy
  tuples
389 1 Robert Bossy
</pre>
390 1 Robert Bossy
391 1 Robert Bossy
If the context element is a relation, then this expression returns a list of all tuples of the relation. Otherwise it returns the empty list.
392 1 Robert Bossy
393 1 Robert Bossy
h3. Tuple arguments
394 1 Robert Bossy
395 1 Robert Bossy
<pre>
396 1 Robert Bossy
  args [ : ROLE ]
397 1 Robert Bossy
</pre>
398 1 Robert Bossy
399 1 Robert Bossy
@ROLE@ is a name. If the context element is a tuple, then this expression returns a singleton list containing the annotation which is the argument of the tuple with the role @ROLE@. If @ROLE@ is omitted, then this expression returns a list containg all arguments of the tuple (in no particular order).
400 1 Robert Bossy
If the context element is not a tuple, or the tuple has no arguments, or if the tuple does not have an argument with the specified role, then this expression returns the empty list.
401 1 Robert Bossy
402 1 Robert Bossy
h3. Reverse tuple lookup
403 1 Robert Bossy
404 1 Robert Bossy
<pre>
405 1 Robert Bossy
  tuples : RELATION [ : ROLE ]
406 1 Robert Bossy
</pre>
407 1 Robert Bossy
408 1 Robert Bossy
@RELATION@ and @ROLE@ are names. If the context element is an annotation, then this expression retuerns a list containing all tuples that satisfy all the following conditions:
409 1 Robert Bossy
# the tuple pertain to the relation with name @RELATION@ in the same section
410 1 Robert Bossy
# the annotation is the argument of the tuple with role @ROLE@, if @ROLE@ is omitted, then the annotation is an argument of the tuple regardless of the role
411 1 Robert Bossy
If the context element is not an annotation, or the section does not contain a relation with the specified name, then this expression returns the empty list.
412 1 Robert Bossy
413 1 Robert Bossy
h3. Tuple relation
414 1 Robert Bossy
415 1 Robert Bossy
<pre>
416 1 Robert Bossy
  relation
417 1 Robert Bossy
</pre>
418 1 Robert Bossy
419 1 Robert Bossy
If the context element is a tuple, then this element returns a singleton list with the relation to which the tuple belongs. Otherwise it returns the empty list.
420 1 Robert Bossy
421 1 Robert Bossy
422 1 Robert Bossy
423 1 Robert Bossy
inside outside after before
424 1 Robert Bossy
document
425 1 Robert Bossy
section