You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

PropertyParser.html 84KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
  2. <!-- Created by htmlize-0.67 in css mode. -->
  3. <html>
  4. <head>
  5. <title>PropertyParser.java</title>
  6. <style type="text/css">
  7. <!--
  8. body {
  9. color: #000000;
  10. background-color: #faf0e6;
  11. } /* default */
  12. .jde-java-font-lock-number {
  13. color: #bc8f8f;
  14. background-color: #faf0e6;
  15. } /* jde-java-font-lock-number-face */
  16. .function-name {
  17. color: #8b2323;
  18. background-color: #faf0e6;
  19. } /* font-lock-function-name-face */
  20. .jde-java-font-lock-italic {
  21. background-color: #faf0e6;
  22. font-style: italic;
  23. } /* jde-java-font-lock-italic-face */
  24. .jde-java-font-lock-modifier {
  25. color: #da70d6;
  26. background-color: #faf0e6;
  27. } /* jde-java-font-lock-modifier-face */
  28. .keyword {
  29. color: #8b0000;
  30. background-color: #faf0e6;
  31. } /* font-lock-keyword-face */
  32. .variable-name {
  33. color: #8b008b;
  34. background-color: #faf0e6;
  35. } /* font-lock-variable-name-face */
  36. .string {
  37. color: #008b00;
  38. background-color: #faf0e6;
  39. } /* font-lock-string-face */
  40. .jde-java-font-lock-package {
  41. color: #0000cd;
  42. background-color: #faf0e6;
  43. } /* jde-java-font-lock-package-face */
  44. .jde-java-font-lock-constant {
  45. color: #5f9ea0;
  46. background-color: #faf0e6;
  47. } /* jde-java-font-lock-constant-face */
  48. .type {
  49. color: #4682b4;
  50. background-color: #faf0e6;
  51. } /* font-lock-type-face */
  52. .jde-java-font-lock-bold {
  53. background-color: #faf0e6;
  54. font-weight: bold;
  55. } /* jde-java-font-lock-bold-face */
  56. .jde-java-font-lock-doc-tag {
  57. color: #008b00;
  58. background-color: #faf0e6;
  59. } /* jde-java-font-lock-doc-tag-face */
  60. .comment {
  61. color: #00008b;
  62. background-color: #faf0e6;
  63. } /* font-lock-comment-face */
  64. .reference {
  65. color: #cd0000;
  66. background-color: #faf0e6;
  67. } /* font-lock-reference-face */
  68. a {
  69. color: inherit;
  70. background-color: inherit;
  71. font: inherit;
  72. text-decoration: inherit;
  73. }
  74. a:hover {
  75. text-decoration: underline;
  76. }
  77. -->
  78. </style>
  79. </head>
  80. <body>
  81. <pre>
  82. <span class="comment">/*
  83. * $Id$
  84. * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
  85. * For details on use and redistribution please refer to the
  86. * LICENSE file included with these sources.
  87. */</span>
  88. <span class="keyword">package</span> <span class="jde-java-font-lock-package">org</span>.<span class="jde-java-font-lock-package">apache</span>.<span class="jde-java-font-lock-package">fop</span>.<span class="jde-java-font-lock-package">fo</span>.<span class="jde-java-font-lock-package">expr</span>;
  89. <span class="keyword">import</span> <span class="jde-java-font-lock-package">org</span>.<span class="jde-java-font-lock-package">apache</span>.<span class="jde-java-font-lock-package">fop</span>.<span class="jde-java-font-lock-package">fo</span>.<span class="type">PropertyConsts</span>;
  90. <span class="keyword">import</span> <span class="jde-java-font-lock-package">org</span>.<span class="jde-java-font-lock-package">apache</span>.<span class="jde-java-font-lock-package">fop</span>.<span class="jde-java-font-lock-package">fo</span>.<span class="jde-java-font-lock-package">properties</span>.<span class="type">Property</span>;
  91. <span class="keyword">import</span> <span class="jde-java-font-lock-package">org</span>.<span class="jde-java-font-lock-package">apache</span>.<span class="jde-java-font-lock-package">fop</span>.<span class="jde-java-font-lock-package">fo</span>.<span class="type">PropNames</span>;
  92. <span class="keyword">import</span> <span class="jde-java-font-lock-package">org</span>.<span class="jde-java-font-lock-package">apache</span>.<span class="jde-java-font-lock-package">fop</span>.<span class="jde-java-font-lock-package">fo</span>.<span class="type">FOTree</span>;
  93. <span class="keyword">import</span> <span class="jde-java-font-lock-package">org</span>.<span class="jde-java-font-lock-package">apache</span>.<span class="jde-java-font-lock-package">fop</span>.<span class="jde-java-font-lock-package">fo</span>.<span class="type">FONode</span>;
  94. <span class="keyword">import</span> <span class="jde-java-font-lock-package">org</span>.<span class="jde-java-font-lock-package">apache</span>.<span class="jde-java-font-lock-package">fop</span>.<span class="jde-java-font-lock-package">fo</span>.<span class="jde-java-font-lock-package">expr</span>.<span class="type">SystemFontFunction</span>;
  95. <span class="keyword">import</span> <span class="jde-java-font-lock-package">org</span>.<span class="jde-java-font-lock-package">apache</span>.<span class="jde-java-font-lock-package">fop</span>.<span class="jde-java-font-lock-package">datatypes</span>.<span class="type">PropertyValue</span>;
  96. <span class="keyword">import</span> <span class="jde-java-font-lock-package">org</span>.<span class="jde-java-font-lock-package">apache</span>.<span class="jde-java-font-lock-package">fop</span>.<span class="jde-java-font-lock-package">datatypes</span>.<span class="type">PropertyValueList</span>;
  97. <span class="keyword">import</span> <span class="jde-java-font-lock-package">org</span>.<span class="jde-java-font-lock-package">apache</span>.<span class="jde-java-font-lock-package">fop</span>.<span class="jde-java-font-lock-package">datatypes</span>.<span class="type">Numeric</span>;
  98. <span class="keyword">import</span> <span class="jde-java-font-lock-package">org</span>.<span class="jde-java-font-lock-package">apache</span>.<span class="jde-java-font-lock-package">fop</span>.<span class="jde-java-font-lock-package">datatypes</span>.<span class="type">Literal</span>;
  99. <span class="keyword">import</span> <span class="jde-java-font-lock-package">org</span>.<span class="jde-java-font-lock-package">apache</span>.<span class="jde-java-font-lock-package">fop</span>.<span class="jde-java-font-lock-package">datatypes</span>.<span class="type">NCName</span>;
  100. <span class="keyword">import</span> <span class="jde-java-font-lock-package">org</span>.<span class="jde-java-font-lock-package">apache</span>.<span class="jde-java-font-lock-package">fop</span>.<span class="jde-java-font-lock-package">datatypes</span>.<span class="type">Percentage</span>;
  101. <span class="keyword">import</span> <span class="jde-java-font-lock-package">org</span>.<span class="jde-java-font-lock-package">apache</span>.<span class="jde-java-font-lock-package">fop</span>.<span class="jde-java-font-lock-package">datatypes</span>.<span class="type">Ems</span>;
  102. <span class="keyword">import</span> <span class="jde-java-font-lock-package">org</span>.<span class="jde-java-font-lock-package">apache</span>.<span class="jde-java-font-lock-package">fop</span>.<span class="jde-java-font-lock-package">datatypes</span>.<span class="type">IntegerType</span>;
  103. <span class="keyword">import</span> <span class="jde-java-font-lock-package">org</span>.<span class="jde-java-font-lock-package">apache</span>.<span class="jde-java-font-lock-package">fop</span>.<span class="jde-java-font-lock-package">datatypes</span>.<span class="type">Length</span>;
  104. <span class="keyword">import</span> <span class="jde-java-font-lock-package">org</span>.<span class="jde-java-font-lock-package">apache</span>.<span class="jde-java-font-lock-package">fop</span>.<span class="jde-java-font-lock-package">datatypes</span>.<span class="type">Time</span>;
  105. <span class="keyword">import</span> <span class="jde-java-font-lock-package">org</span>.<span class="jde-java-font-lock-package">apache</span>.<span class="jde-java-font-lock-package">fop</span>.<span class="jde-java-font-lock-package">datatypes</span>.<span class="type">Frequency</span>;
  106. <span class="keyword">import</span> <span class="jde-java-font-lock-package">org</span>.<span class="jde-java-font-lock-package">apache</span>.<span class="jde-java-font-lock-package">fop</span>.<span class="jde-java-font-lock-package">datatypes</span>.<span class="type">Angle</span>;
  107. <span class="keyword">import</span> <span class="jde-java-font-lock-package">org</span>.<span class="jde-java-font-lock-package">apache</span>.<span class="jde-java-font-lock-package">fop</span>.<span class="jde-java-font-lock-package">datatypes</span>.<span class="type">Bool</span>;
  108. <span class="keyword">import</span> <span class="jde-java-font-lock-package">org</span>.<span class="jde-java-font-lock-package">apache</span>.<span class="jde-java-font-lock-package">fop</span>.<span class="jde-java-font-lock-package">datatypes</span>.<span class="type">Auto</span>;
  109. <span class="keyword">import</span> <span class="jde-java-font-lock-package">org</span>.<span class="jde-java-font-lock-package">apache</span>.<span class="jde-java-font-lock-package">fop</span>.<span class="jde-java-font-lock-package">datatypes</span>.<span class="type">None</span>;
  110. <span class="keyword">import</span> <span class="jde-java-font-lock-package">org</span>.<span class="jde-java-font-lock-package">apache</span>.<span class="jde-java-font-lock-package">fop</span>.<span class="jde-java-font-lock-package">datatypes</span>.<span class="type">Slash</span>;
  111. <span class="keyword">import</span> <span class="jde-java-font-lock-package">org</span>.<span class="jde-java-font-lock-package">apache</span>.<span class="jde-java-font-lock-package">fop</span>.<span class="jde-java-font-lock-package">datatypes</span>.<span class="type">ColorType</span>;
  112. <span class="keyword">import</span> <span class="jde-java-font-lock-package">org</span>.<span class="jde-java-font-lock-package">apache</span>.<span class="jde-java-font-lock-package">fop</span>.<span class="jde-java-font-lock-package">datatypes</span>.<span class="type">StringType</span>;
  113. <span class="keyword">import</span> <span class="jde-java-font-lock-package">org</span>.<span class="jde-java-font-lock-package">apache</span>.<span class="jde-java-font-lock-package">fop</span>.<span class="jde-java-font-lock-package">datatypes</span>.<span class="type">MimeType</span>;
  114. <span class="keyword">import</span> <span class="jde-java-font-lock-package">org</span>.<span class="jde-java-font-lock-package">apache</span>.<span class="jde-java-font-lock-package">fop</span>.<span class="jde-java-font-lock-package">datatypes</span>.<span class="type">UriType</span>;
  115. <span class="keyword">import</span> <span class="jde-java-font-lock-package">org</span>.<span class="jde-java-font-lock-package">apache</span>.<span class="jde-java-font-lock-package">fop</span>.<span class="jde-java-font-lock-package">datatypes</span>.<span class="jde-java-font-lock-package">indirect</span>.<span class="type">Inherit</span>;
  116. <span class="keyword">import</span> <span class="jde-java-font-lock-package">org</span>.<span class="jde-java-font-lock-package">apache</span>.<span class="jde-java-font-lock-package">fop</span>.<span class="jde-java-font-lock-package">datatypes</span>.<span class="jde-java-font-lock-package">indirect</span>.<span class="type">InheritedValue</span>;
  117. <span class="keyword">import</span> <span class="jde-java-font-lock-package">org</span>.<span class="jde-java-font-lock-package">apache</span>.<span class="jde-java-font-lock-package">fop</span>.<span class="jde-java-font-lock-package">datatypes</span>.<span class="jde-java-font-lock-package">indirect</span>.<span class="type">FromParent</span>;
  118. <span class="keyword">import</span> <span class="jde-java-font-lock-package">org</span>.<span class="jde-java-font-lock-package">apache</span>.<span class="jde-java-font-lock-package">fop</span>.<span class="jde-java-font-lock-package">datatypes</span>.<span class="jde-java-font-lock-package">indirect</span>.<span class="type">FromNearestSpecified</span>;
  119. <span class="keyword">import</span> <span class="jde-java-font-lock-package">java</span>.<span class="jde-java-font-lock-package">util</span>.<span class="type">HashMap</span>;
  120. <span class="comment">/**
  121. * Class to parse XSL FO property expression.
  122. * This class is heavily based on the expression parser in James Clark's
  123. * XT, an XSLT processor.
  124. *
  125. * PropertyParser objects are re-usable. The constructor simply creates the
  126. * object. To parse an expression, the public method &lt;i&gt;</span><span class="jde-java-font-lock-italic">Parse</span><span class="comment">&lt;/i&gt; is
  127. * called.
  128. */</span>
  129. <span class="jde-java-font-lock-modifier">public</span> <span class="keyword">class</span> <span class="function-name" id="PropertyParserClass">PropertyParser</span> <span class="keyword">extends</span> <span class="type">PropertyTokenizer</span> {
  130. <span class="jde-java-font-lock-modifier">private</span> <span class="jde-java-font-lock-modifier">static</span> <span class="jde-java-font-lock-modifier">final</span> <span class="type">String</span> <span class="variable-name" id="tag">tag</span> = &quot;<span class="string">$Name$</span>&quot;;
  131. <span class="jde-java-font-lock-modifier">private</span> <span class="jde-java-font-lock-modifier">static</span> <span class="jde-java-font-lock-modifier">final</span> <span class="type">String</span> <span class="variable-name" id="revision">revision</span> = &quot;<span class="string">$Revision$</span>&quot;;
  132. <span class="comment">/** The FO tree which has initiated this parser */</span>
  133. <span class="jde-java-font-lock-modifier">private</span> <span class="type">FOTree</span> <span class="variable-name" id="foTree">foTree</span>;
  134. <span class="comment">/** The FONode which has initiated this parser */</span>
  135. <span class="jde-java-font-lock-modifier">private</span> <span class="type">FONode</span> <span class="variable-name" id="node">node</span>;
  136. <span class="jde-java-font-lock-modifier">public</span> <span class="function-name" id="PropertyParser">PropertyParser</span>(<span class="type">FOTree</span> <span class="variable-name">foTree</span>) {
  137. <span class="keyword">super</span>();
  138. <span class="keyword">this</span>.foTree = foTree;
  139. }
  140. <span class="comment">/**
  141. * Parse the property expression described in the instance variables.
  142. *
  143. * &lt;p&gt;The &lt;tt&gt;PropertyValue&lt;/tt&gt; returned by this function has the
  144. * following characteristics:
  145. * If the expression resolves to a single element that object is returned
  146. * directly in an object which implements &lt;PropertyValue&lt;/tt&gt;.
  147. *
  148. * &lt;p&gt;If the expression cannot be resolved into a single object, the set
  149. * to which it resolves is returned in a &lt;tt&gt;PropertyValueList&lt;/tt&gt; object
  150. * (which itself implements &lt;tt&gt;PropertyValue&lt;/tt&gt;).
  151. *
  152. * &lt;p&gt;The &lt;tt&gt;PropertyValueList&lt;/tt&gt; contains objects whose corresponding
  153. * elements in the original expression were separated by &lt;em&gt;</span><span class="jde-java-font-lock-italic">commas</span><span class="comment">&lt;/em&gt;.
  154. *
  155. * &lt;p&gt;Objects whose corresponding elements in the original expression
  156. * were separated by spaces are composed into a sublist contained in
  157. * another &lt;tt&gt;PropertyValueList&lt;/tt&gt;. If all of the elements in the
  158. * expression were separated by spaces, the returned
  159. * &lt;tt&gt;PropertyValueList&lt;/tt&gt; will contain one element, a
  160. * &lt;tt&gt;PropertyValueList&lt;/tt&gt; containing objects representing each of
  161. * the space-separated elements in the original expression.
  162. *
  163. * &lt;p&gt;E.g., if a &lt;b&gt;</span><span class="jde-java-font-lock-bold">font-family</span><span class="comment">&lt;/b&gt; property is assigned the string
  164. * &lt;em&gt;</span><span class="jde-java-font-lock-italic">Palatino, New Century Schoolbook, serif</span><span class="comment">&lt;/em&gt;, the returned value
  165. * will look like this:
  166. * &lt;pre&gt;
  167. * PropertyValueList(NCName('Palatino')
  168. * PropertyValueList(NCName('New')
  169. * NCName('Century')
  170. * NCName('Schoolbook') )
  171. * NCName('serif') )
  172. * &lt;/pre&gt;
  173. * &lt;p&gt;If the property had been assigned the string
  174. * &lt;em&gt;</span><span class="jde-java-font-lock-italic">Palatino, &quot;New Century Schoolbook&quot;, serif</span><span class="comment">&lt;/em&gt;, the returned value
  175. * would look like this:
  176. * &lt;pre&gt;
  177. * PropertyValueList(NCName('Palatino')
  178. * NCName('New Century Schoolbook')
  179. * NCName('serif') )
  180. * &lt;/pre&gt;
  181. * &lt;p&gt;If a &lt;b&gt;</span><span class="jde-java-font-lock-bold">background-position</span><span class="comment">&lt;/b&gt; property is assigned the string
  182. * &lt;em&gt;</span><span class="jde-java-font-lock-italic">top center</span><span class="comment">&lt;/em&gt;, the returned value will look like this:
  183. * &lt;pre&gt;
  184. * PropertyValueList(PropertyValueList(NCName('top')
  185. * NCName('center') ) )
  186. * &lt;/pre&gt;
  187. *
  188. * &lt;p&gt;Note: If the property expression String is empty, a StringProperty
  189. * object holding an empty String is returned.
  190. * </span><span class="jde-java-font-lock-doc-tag">@param</span><span class="comment"> </span><span class="variable-name">node</span><span class="comment"> - the &lt;tt&gt;FONode&lt;/tt&gt; for which the property expression
  191. * is being resolved.
  192. * </span><span class="jde-java-font-lock-doc-tag">@param</span><span class="comment"> </span><span class="variable-name" id="property">property</span><span class="comment"> - an &lt;tt&gt;int&lt;/tt&gt; containing the property index.
  193. * which the property expression is to be evaluated.
  194. * </span><span class="jde-java-font-lock-doc-tag">@param</span><span class="comment"> </span><span class="variable-name" id="expr">expr</span><span class="comment"> - the specified value (attribute on the xml element).
  195. * </span><span class="jde-java-font-lock-doc-tag">@return</span><span class="comment"> a PropertyValue holding the parsed result.
  196. * </span><span class="jde-java-font-lock-doc-tag">@throws</span><span class="comment"> </span><span class="type">PropertyException</span><span class="comment"> if the &quot;expr&quot; cannot be parsed as a
  197. * PropertyValue.
  198. */</span>
  199. <span class="jde-java-font-lock-modifier">public</span> <span class="type">PropertyValue</span> <span class="function-name" id="parse">parse</span>(<span class="type">FONode</span> <span class="variable-name">node</span>, <span class="type">int</span> <span class="variable-name">property</span>, <span class="type">String</span> <span class="variable-name">expr</span>)
  200. <span class="keyword">throws</span> <span class="type">PropertyException</span>
  201. {
  202. <span class="comment">//System.out.println(&quot;-----Entering parse:&quot;
  203. </span> <span class="comment">// + PropNames.getPropertyName(property) + &quot; &quot; + expr);
  204. </span> <span class="jde-java-font-lock-modifier">synchronized</span> (<span class="keyword">this</span>) {
  205. <span class="comment">// make sure this parser is available
  206. </span> <span class="keyword">if</span> (getExpr() != <span class="jde-java-font-lock-constant" id="null">null</span>) <span class="comment">// the parser is currently active
  207. </span> <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>
  208. (&quot;<span class="string">PropertyParser is currently active: </span>&quot; + getExpr());
  209. initialize(property, expr);
  210. <span class="keyword">this</span>.node = node;
  211. }
  212. next();
  213. <span class="keyword">if</span> (currentToken == <span class="jde-java-font-lock-constant" id="EOF">EOF</span>)
  214. <span class="comment">// prop value is empty
  215. </span> <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>
  216. (&quot;<span class="string">No token recognized in :</span>&quot; + expr + &quot;<span class="string">:</span>&quot;);
  217. <span class="type">PropertyValueList</span> <span class="variable-name" id="propList">propList</span> = <span class="keyword">new</span> <span class="type">PropertyValueList</span>(property);
  218. <span class="keyword">while</span> (<span class="jde-java-font-lock-constant" id="true">true</span>) {
  219. <span class="type">PropertyValue</span> <span class="variable-name" id="prop">prop</span> = parseAdditiveExpr();
  220. <span class="keyword">if</span> (currentToken == <span class="jde-java-font-lock-constant">EOF</span>) {
  221. <span class="comment">// end of the expression - add to list and go
  222. </span> <span class="keyword">if</span> (propList.size() != <span class="jde-java-font-lock-number">0</span>) {
  223. propList.add(prop);
  224. reset();
  225. <span class="keyword">return</span> propList;
  226. } <span class="keyword">else</span> { <span class="comment">// list is empty
  227. </span> reset();
  228. <span class="keyword">return</span> prop;
  229. }
  230. }
  231. <span class="comment">// throw away commas separating arguments. These can occur
  232. </span> <span class="comment">// in font-family and voice-family. Commas are regarded here
  233. </span> <span class="comment">// as separators of list and sublist elements.
  234. </span> <span class="comment">// See 7.16.5 &quot;text-shadow&quot; in the 1.0 Recommendation for an
  235. </span> <span class="comment">// example of sublists.
  236. </span> <span class="keyword">if</span> (currentToken == <span class="jde-java-font-lock-constant" id="COMMA">COMMA</span>) {
  237. next();
  238. propList.add(prop);
  239. } <span class="keyword">else</span> { <span class="comment">// whitespace separates list elements; make a sublist
  240. </span> propList.add(parseSublist(prop));
  241. <span class="keyword">if</span> (currentToken == <span class="jde-java-font-lock-constant">EOF</span>) {
  242. reset();
  243. <span class="keyword">return</span> propList;
  244. }
  245. }
  246. }
  247. }
  248. <span class="comment">/**
  249. * &lt;p&gt;Parse a property values sublist - a list of whitespace separated
  250. * &lt;tt&gt;PropertyValue&lt;/tt&gt;s.
  251. * &lt;p&gt;
  252. * Property value expressions for various properties may contain lists
  253. * of values, which may be separated by whitespace or by commas. See,
  254. * e.g., 7.6.17 &quot;voice-family&quot; and 7.8.2 &quot;font-family&quot;. The shorthands
  255. * may also contain lists of elements, generally (or exclusively)
  256. * whitespace separated. 7.16.5 &quot;text-shadow&quot; allows whitespace
  257. * separated length doubles or triples to be specified for individual
  258. * shadow effects, with multiple shadow effects, each separated by
  259. * commmas.
  260. * </span><span class="jde-java-font-lock-doc-tag">@param</span><span class="comment"> </span><span class="variable-name" id="initialValue">initialValue</span><span class="comment"> a &lt;tt&gt;PropertyValue&lt;/tt&gt; to assign as the initial
  261. * value of the sublist. The detection of this value, which is
  262. * whitespace separated from a subsequent value, has been the
  263. * trigger for the creation of the sublist.
  264. * </span><span class="jde-java-font-lock-doc-tag">@return</span><span class="comment"> a &lt;tt&gt;PropertyValueList&lt;/tt&gt; containing the sublist. The
  265. * indicatior for the end of the sublist is the end of the expression,
  266. * or a comma.
  267. */</span>
  268. <span class="type">PropertyValueList</span> <span class="function-name" id="parseSublist">parseSublist</span>(<span class="type">PropertyValue</span> <span class="variable-name">initialValue</span>)
  269. <span class="keyword">throws</span> <span class="type">PropertyException</span>
  270. {
  271. <span class="type">PropertyValueList</span> <span class="variable-name" id="sublist">sublist</span> = <span class="keyword">new</span> <span class="type">PropertyValueList</span>(property);
  272. sublist.add(initialValue);
  273. <span class="keyword">while</span> (<span class="jde-java-font-lock-constant">true</span>) {
  274. <span class="type">PropertyValue</span> <span class="variable-name">prop</span> = parseAdditiveExpr();
  275. <span class="keyword">if</span> (currentToken == <span class="jde-java-font-lock-constant">EOF</span>) {
  276. <span class="comment">// end of the expression - add to sublist and go
  277. </span> sublist.add(prop);
  278. <span class="keyword">return</span> sublist;
  279. }
  280. <span class="comment">// Comma separates next element - end of sublist
  281. </span> <span class="keyword">if</span> (currentToken == <span class="jde-java-font-lock-constant">COMMA</span>) {
  282. next();
  283. sublist.add(prop);
  284. <span class="keyword">return</span> sublist;
  285. } <span class="keyword">else</span> { <span class="comment">// whitespace separates next elements; add to sublist
  286. </span> sublist.add(prop);
  287. }
  288. }
  289. }
  290. <span class="comment">/**
  291. * Reset the parser by resetting the tokenizer to null (or equivalent)
  292. * values.
  293. */</span>
  294. <span class="jde-java-font-lock-modifier">public</span> <span class="type">void</span> <span class="function-name" id="resetParser">resetParser</span>() {
  295. <span class="jde-java-font-lock-modifier">synchronized</span> (<span class="keyword">this</span>) {
  296. <span class="comment">//elementsSeen = 0;
  297. </span> <span class="comment">//restrictedValueFunctSeen = null;
  298. </span> reset();
  299. }
  300. }
  301. <span class="comment">/**
  302. * Generate an arithmetic error string.
  303. * </span><span class="jde-java-font-lock-doc-tag">@return</span><span class="comment"> arithmetic error message.
  304. */</span>
  305. <span class="jde-java-font-lock-modifier">private</span> <span class="type">String</span> <span class="function-name" id="arithErrorStr">arithErrorStr</span>() {
  306. <span class="keyword">return</span> &quot;<span class="string">Arithmetic operator not followed by Numeric or integer: </span>&quot;
  307. + getExpr();
  308. }
  309. <span class="comment">/**
  310. * Generate an function numeric argument error string.
  311. * </span><span class="jde-java-font-lock-doc-tag">@return</span><span class="comment"> function numeric argument error message.
  312. */</span>
  313. <span class="jde-java-font-lock-modifier">private</span> <span class="type">String</span> <span class="function-name" id="funcNumericErrorStr">funcNumericErrorStr</span>() {
  314. <span class="keyword">return</span> &quot;<span class="string">Function requires Numeric or integer argument: </span>&quot;
  315. + getExpr();
  316. }
  317. <span class="comment">/**
  318. * Try to parse an addition or subtraction expression and return the
  319. * resulting PropertyValue.
  320. */</span>
  321. <span class="jde-java-font-lock-modifier">private</span> <span class="type">PropertyValue</span> <span class="function-name" id="parseAdditiveExpr">parseAdditiveExpr</span>() <span class="keyword">throws</span> <span class="type">PropertyException</span> {
  322. <span class="comment">// Evaluate and put result on the operand stack
  323. </span> <span class="comment">//System.out.println(&quot;parseAdd&quot;);
  324. </span> <span class="type">PropertyValue</span> <span class="variable-name">prop</span> = parseMultiplicativeExpr();
  325. <span class="type">PropertyValue</span> <span class="variable-name" id="pv">pv</span>;
  326. <span class="reference">outer</span>:
  327. <span class="keyword">for</span> (; ; ) {
  328. <span class="reference">inner</span>:
  329. <span class="keyword">switch</span> (prop.getType()) {
  330. <span class="keyword">case</span> <span class="reference">PropertyValue.NUMERIC</span>: {
  331. <span class="keyword">switch</span> (currentToken) {
  332. <span class="keyword">case</span> <span class="reference">PLUS</span>:
  333. next();
  334. pv = parseMultiplicativeExpr();
  335. <span class="keyword">switch</span> (pv.getType()) {
  336. <span class="keyword">case</span> <span class="reference">PropertyValue.NUMERIC</span>:
  337. ((<span class="type">Numeric</span>)prop).add((<span class="type">Numeric</span>)pv);
  338. <span class="keyword">break</span> <span class="reference">inner</span>;
  339. <span class="keyword">case</span> <span class="reference">PropertyValue.INTEGER</span>:
  340. ((<span class="type">Numeric</span>)prop).add((<span class="type">double</span>)
  341. (((<span class="type">IntegerType</span>)pv).getInt()));
  342. <span class="keyword">break</span> <span class="reference">inner</span>;
  343. <span class="keyword">default</span>:
  344. <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>(arithErrorStr());
  345. }
  346. <span class="keyword">case</span> <span class="reference">MINUS</span>:
  347. next();
  348. pv = parseMultiplicativeExpr();
  349. <span class="keyword">switch</span> (pv.getType()) {
  350. <span class="keyword">case</span> <span class="reference">PropertyValue.NUMERIC</span>:
  351. ((<span class="type">Numeric</span>)prop).subtract((<span class="type">Numeric</span>)pv);
  352. <span class="keyword">break</span> <span class="reference">inner</span>;
  353. <span class="keyword">case</span> <span class="reference">PropertyValue.INTEGER</span>:
  354. ((<span class="type">Numeric</span>)prop).subtract((<span class="type">double</span>)
  355. (((<span class="type">IntegerType</span>)pv).getInt()));
  356. <span class="keyword">break</span> <span class="reference">inner</span>;
  357. <span class="keyword">default</span>:
  358. <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>(arithErrorStr());
  359. }
  360. <span class="keyword">default</span>:
  361. <span class="keyword">break</span> <span class="reference">outer</span>;
  362. }
  363. }
  364. <span class="keyword">case</span> <span class="reference">PropertyValue.INTEGER</span>: {
  365. <span class="type">int</span> <span class="variable-name" id="intVal">intVal</span> = ((<span class="type">IntegerType</span>)prop).getInt();
  366. <span class="keyword">switch</span> (currentToken) {
  367. <span class="keyword">case</span> <span class="reference">PLUS</span>:
  368. next();
  369. pv = parseMultiplicativeExpr();
  370. <span class="keyword">switch</span> (pv.getType()) {
  371. <span class="keyword">case</span> <span class="reference">PropertyValue.NUMERIC</span>:
  372. prop = ((<span class="type">Numeric</span>)pv).add((<span class="type">double</span>)intVal);
  373. <span class="keyword">break</span> <span class="reference">inner</span>;
  374. <span class="keyword">case</span> <span class="reference">PropertyValue.INTEGER</span>:
  375. ((<span class="type">IntegerType</span>)prop).setInt(intVal +
  376. ((<span class="type">IntegerType</span>)pv).getInt());
  377. <span class="keyword">break</span> <span class="reference">inner</span>;
  378. <span class="keyword">default</span>:
  379. <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>(arithErrorStr());
  380. }
  381. <span class="keyword">case</span> <span class="reference">MINUS</span>:
  382. next();
  383. pv = parseMultiplicativeExpr();
  384. <span class="keyword">switch</span> (pv.getType()) {
  385. <span class="keyword">case</span> <span class="reference">PropertyValue.NUMERIC</span>:
  386. ((<span class="type">Numeric</span>)pv).add((<span class="type">double</span>)(-intVal));
  387. prop = ((<span class="type">Numeric</span>)pv).negate();
  388. <span class="keyword">break</span> <span class="reference">inner</span>;
  389. <span class="keyword">case</span> <span class="reference">PropertyValue.INTEGER</span>:
  390. ((<span class="type">IntegerType</span>)prop).setInt(intVal +
  391. ((<span class="type">IntegerType</span>)pv).getInt());
  392. <span class="keyword">break</span> <span class="reference">inner</span>;
  393. <span class="keyword">default</span>:
  394. <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>(arithErrorStr());
  395. }
  396. <span class="keyword">default</span>:
  397. <span class="keyword">break</span> <span class="reference">outer</span>;
  398. }
  399. }
  400. <span class="keyword">default</span>:
  401. <span class="keyword">break</span> <span class="reference">outer</span>;
  402. }
  403. }
  404. <span class="keyword">return</span> prop;
  405. }
  406. <span class="comment">/**
  407. * Try to parse a multiply, divide or modulo expression and return
  408. * the resulting PropertyValue.
  409. */</span>
  410. <span class="jde-java-font-lock-modifier">private</span> <span class="type">PropertyValue</span> <span class="function-name" id="parseMultiplicativeExpr">parseMultiplicativeExpr</span>() <span class="keyword">throws</span> <span class="type">PropertyException</span> {
  411. <span class="comment">//System.out.println(&quot;parseMult&quot;);
  412. </span> <span class="type">PropertyValue</span> <span class="variable-name">prop</span> = parseUnaryExpr();
  413. <span class="type">PropertyValue</span> <span class="variable-name">pv</span>;
  414. <span class="reference">outer</span>:
  415. <span class="comment">// Outer loop exists to handle a sequence of multiplicative operations
  416. </span> <span class="comment">// e.g. 5 * 4 / 2
  417. </span> <span class="comment">// break outer; will terminate the multiplicative expression parsing
  418. </span> <span class="comment">// break inner; will look for another trailing multiplicative
  419. </span> <span class="comment">// operator.
  420. </span> <span class="keyword">for</span> (; ; ) {
  421. <span class="reference">inner</span>:
  422. <span class="keyword">switch</span> (prop.getType()) {
  423. <span class="keyword">case</span> <span class="reference">PropertyValue.NUMERIC</span>:
  424. <span class="keyword">switch</span> (currentToken) {
  425. <span class="keyword">case</span> <span class="reference">DIV</span>:
  426. next();
  427. pv = parseUnaryExpr();
  428. <span class="keyword">switch</span> (pv.getType()) {
  429. <span class="keyword">case</span> <span class="reference">PropertyValue.INTEGER</span>:
  430. ((<span class="type">Numeric</span>)prop).divide
  431. ((<span class="type">double</span>)(((<span class="type">IntegerType</span>)pv).getInt()));
  432. <span class="keyword">break</span> <span class="reference">inner</span>;
  433. <span class="keyword">case</span> <span class="reference">PropertyValue.NUMERIC</span>:
  434. ((<span class="type">Numeric</span>)prop).divide((<span class="type">Numeric</span>)pv);
  435. <span class="keyword">break</span> <span class="reference">inner</span>;
  436. <span class="keyword">default</span>:
  437. <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>(arithErrorStr());
  438. }
  439. <span class="keyword">case</span> <span class="reference">MOD</span>:
  440. next();
  441. pv = parseUnaryExpr();
  442. <span class="keyword">switch</span> (pv.getType()) {
  443. <span class="keyword">case</span> <span class="reference">PropertyValue.INTEGER</span>:
  444. ((<span class="type">Numeric</span>)prop).mod
  445. ((<span class="type">double</span>)(((<span class="type">IntegerType</span>)pv).getInt()));
  446. <span class="keyword">break</span> <span class="reference">inner</span>;
  447. <span class="keyword">case</span> <span class="reference">PropertyValue.NUMERIC</span>:
  448. ((<span class="type">Numeric</span>)prop).mod((<span class="type">Numeric</span>)pv);
  449. <span class="keyword">break</span> <span class="reference">inner</span>;
  450. <span class="keyword">default</span>:
  451. <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>(arithErrorStr());
  452. }
  453. <span class="keyword">case</span> <span class="reference">MULTIPLY</span>:
  454. next();
  455. pv = parseUnaryExpr();
  456. <span class="keyword">switch</span> (pv.getType()) {
  457. <span class="keyword">case</span> <span class="reference">PropertyValue.INTEGER</span>:
  458. ((<span class="type">Numeric</span>)prop).multiply
  459. ((<span class="type">double</span>)(((<span class="type">IntegerType</span>)pv).getInt()));
  460. <span class="keyword">break</span> <span class="reference">inner</span>;
  461. <span class="keyword">case</span> <span class="reference">PropertyValue.NUMERIC</span>:
  462. ((<span class="type">Numeric</span>)prop).multiply((<span class="type">Numeric</span>)pv);
  463. <span class="keyword">break</span> <span class="reference">inner</span>;
  464. <span class="keyword">default</span>:
  465. <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>(arithErrorStr());
  466. }
  467. <span class="keyword">default</span>:
  468. <span class="keyword">break</span> <span class="reference">outer</span>;
  469. }
  470. <span class="comment">// N.B. The above case cannot fall through to here
  471. </span> <span class="keyword">case</span> <span class="reference">PropertyValue.INTEGER</span>:
  472. <span class="comment">// This code treats all multiplicative operations as implicit
  473. </span> <span class="comment">// operations on doubles. It might be reasonable to allow
  474. </span> <span class="comment">// an integer multiply.
  475. </span> <span class="type">int</span> <span class="variable-name">intVal</span> = ((<span class="type">IntegerType</span>)prop).getInt();
  476. <span class="keyword">switch</span> (currentToken) {
  477. <span class="keyword">case</span> <span class="reference">DIV</span>:
  478. next();
  479. pv = parseUnaryExpr();
  480. <span class="keyword">switch</span> (pv.getType()) {
  481. <span class="keyword">case</span> <span class="reference">PropertyValue.INTEGER</span>:
  482. prop = <span class="keyword">new</span> <span class="type">Numeric</span>(property,
  483. (<span class="type">double</span>)intVal / ((<span class="type">IntegerType</span>)pv).getInt());
  484. <span class="keyword">break</span> <span class="reference">inner</span>;
  485. <span class="keyword">case</span> <span class="reference">PropertyValue.NUMERIC</span>:
  486. prop = (<span class="keyword">new</span> <span class="type">Numeric</span>(property, (<span class="type">double</span>)intVal))
  487. .divide((<span class="type">Numeric</span>)pv);
  488. <span class="keyword">break</span> <span class="reference">inner</span>;
  489. <span class="keyword">default</span>:
  490. <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>(arithErrorStr());
  491. }
  492. <span class="keyword">case</span> <span class="reference">MOD</span>:
  493. next();
  494. pv = parseUnaryExpr();
  495. <span class="keyword">switch</span> (pv.getType()) {
  496. <span class="keyword">case</span> <span class="reference">PropertyValue.INTEGER</span>:
  497. prop = <span class="keyword">new</span> <span class="type">Numeric</span>(property,
  498. ((<span class="type">double</span>)intVal) % ((<span class="type">IntegerType</span>)pv).getInt());
  499. <span class="keyword">break</span> <span class="reference">inner</span>;
  500. <span class="keyword">case</span> <span class="reference">PropertyValue.NUMERIC</span>:
  501. prop = (<span class="keyword">new</span> <span class="type">Numeric</span>(property, (<span class="type">double</span>)intVal))
  502. .mod((<span class="type">Numeric</span>)pv);
  503. <span class="keyword">break</span> <span class="reference">inner</span>;
  504. <span class="keyword">default</span>:
  505. <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>(arithErrorStr());
  506. }
  507. <span class="keyword">case</span> <span class="reference">MULTIPLY</span>:
  508. next();
  509. pv = parseUnaryExpr();
  510. <span class="keyword">switch</span> (pv.getType()) {
  511. <span class="keyword">case</span> <span class="reference">PropertyValue.INTEGER</span>:
  512. prop = <span class="keyword">new</span> <span class="type">Numeric</span>(property,
  513. ((<span class="type">double</span>)intVal) * ((<span class="type">IntegerType</span>)pv).getInt());
  514. <span class="keyword">break</span> <span class="reference">inner</span>;
  515. <span class="keyword">case</span> <span class="reference">PropertyValue.NUMERIC</span>:
  516. prop = (<span class="keyword">new</span> <span class="type">Numeric</span>(property, (<span class="type">double</span>)intVal))
  517. .multiply((<span class="type">Numeric</span>)pv);
  518. <span class="keyword">break</span> <span class="reference">inner</span>;
  519. <span class="keyword">default</span>:
  520. <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>(arithErrorStr());
  521. }
  522. <span class="keyword">default</span>:
  523. <span class="keyword">break</span> <span class="reference">outer</span>;
  524. }
  525. <span class="keyword">default</span>:
  526. <span class="keyword">break</span> <span class="reference">outer</span>;
  527. }
  528. }
  529. <span class="keyword">return</span> prop;
  530. }
  531. <span class="comment">/**
  532. * Try to parse a unary minus expression and return the
  533. * resulting PropertyValue.
  534. */</span>
  535. <span class="jde-java-font-lock-modifier">private</span> <span class="type">PropertyValue</span> <span class="function-name" id="parseUnaryExpr">parseUnaryExpr</span>() <span class="keyword">throws</span> <span class="type">PropertyException</span> {
  536. <span class="comment">//System.out.println(&quot;Unary entry&quot;);
  537. </span> <span class="keyword">if</span> (currentToken == <span class="jde-java-font-lock-constant" id="MINUS">MINUS</span>) {
  538. next();
  539. <span class="type">PropertyValue</span> <span class="variable-name">pv</span> = parseUnaryExpr();
  540. <span class="keyword">switch</span> (pv.getType()) {
  541. <span class="keyword">case</span> <span class="reference">PropertyValue.NUMERIC</span>:
  542. <span class="keyword">return</span> ((<span class="type">Numeric</span>)pv).negate();
  543. <span class="keyword">case</span> <span class="reference">PropertyValue.INTEGER</span>:
  544. ((<span class="type">IntegerType</span>)pv).setInt( -((<span class="type">IntegerType</span>)pv).getInt());
  545. <span class="keyword">return</span> pv;
  546. <span class="keyword">default</span>:
  547. <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>(arithErrorStr());
  548. }
  549. }
  550. <span class="keyword">return</span> parsePrimaryExpr();
  551. }
  552. <span class="comment">/**
  553. * Checks that the current token is a right parenthesis
  554. * and throws an exception if this isn't the case.
  555. */</span>
  556. <span class="jde-java-font-lock-modifier">private</span> <span class="jde-java-font-lock-modifier">final</span> <span class="type">void</span> <span class="function-name" id="expectRpar">expectRpar</span>() <span class="keyword">throws</span> <span class="type">PropertyException</span> {
  557. <span class="keyword">if</span> (currentToken != <span class="jde-java-font-lock-constant" id="RPAR">RPAR</span>)
  558. <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>(&quot;<span class="string">expected )</span>&quot;);
  559. next();
  560. }
  561. <span class="comment">/**
  562. * Try to parse a primary expression and return the
  563. * resulting PropertyValue.
  564. * A primary expression is either a parenthesized expression or an
  565. * expression representing a primitive PropertyValue datatype, such as a
  566. * string literal, an NCname, a number or a unit expression, or a
  567. * function call expression.
  568. */</span>
  569. <span class="jde-java-font-lock-modifier">private</span> <span class="type">PropertyValue</span> <span class="function-name" id="parsePrimaryExpr">parsePrimaryExpr</span>() <span class="keyword">throws</span> <span class="type">PropertyException</span> {
  570. <span class="type">PropertyValue</span> <span class="variable-name">prop</span>;
  571. <span class="comment">//System.out.println(&quot;Primary currentToken:&quot; + currentToken + &quot; &quot;
  572. </span> <span class="comment">// + currentTokenValue);
  573. </span> <span class="keyword">switch</span> (currentToken) {
  574. <span class="keyword">case</span> <span class="reference">LPAR</span>:
  575. next();
  576. prop = parseAdditiveExpr();
  577. expectRpar();
  578. <span class="comment">// Do this here, rather than breaking, because expectRpar()
  579. </span> <span class="comment">// consumes the right parenthesis and calls next().
  580. </span> <span class="keyword">return</span> prop;
  581. <span class="keyword">case</span> <span class="reference">LITERAL</span>:
  582. prop = <span class="keyword">new</span> <span class="type">Literal</span>(property, currentTokenValue);
  583. <span class="keyword">break</span>;
  584. <span class="keyword">case</span> <span class="reference">NCNAME</span>:
  585. <span class="comment">// Interpret this in context of the property or do it later?
  586. </span> prop = <span class="keyword">new</span> <span class="type">NCName</span>(property, currentTokenValue);
  587. <span class="keyword">break</span>;
  588. <span class="keyword">case</span> <span class="reference">FLOAT</span>:
  589. <span class="comment">// Do I need to differentiate here between floats and integers?
  590. </span> prop = <span class="keyword">new</span> <span class="type">Numeric</span>
  591. (property, Double.parseDouble(currentTokenValue));
  592. <span class="keyword">break</span>;
  593. <span class="keyword">case</span> <span class="reference">INTEGER</span>:
  594. prop = <span class="keyword">new</span> <span class="type">IntegerType</span>
  595. (property, Integer.parseInt(currentTokenValue));
  596. <span class="keyword">break</span>;
  597. <span class="keyword">case</span> <span class="reference">PERCENT</span>:
  598. <span class="comment">/*
  599. * Generate a Percentage object with the percentage number.
  600. * The constructor converts this to a straight multiplicative
  601. * factor by dividing by 100.
  602. */</span>
  603. prop = Percentage.makePercentage
  604. (property, Double.parseDouble(currentTokenValue));
  605. <span class="keyword">break</span>;
  606. <span class="keyword">case</span> <span class="reference">ABSOLUTE_LENGTH</span>:
  607. prop = Length.makeLength(property,
  608. Double.parseDouble(currentTokenValue),
  609. currentUnit);
  610. <span class="keyword">break</span>;
  611. <span class="keyword">case</span> <span class="reference">TIME</span>:
  612. prop = <span class="keyword">new</span> <span class="type">Time</span>(property, currentUnit,
  613. Double.parseDouble(currentTokenValue));
  614. <span class="keyword">break</span>;
  615. <span class="keyword">case</span> <span class="reference">FREQ</span>:
  616. prop = <span class="keyword">new</span> <span class="type">Frequency</span>(property, currentUnit,
  617. Double.parseDouble(currentTokenValue));
  618. <span class="keyword">break</span>;
  619. <span class="keyword">case</span> <span class="reference">ANGLE</span>:
  620. prop = <span class="keyword">new</span> <span class="type">Angle</span>(property, currentUnit,
  621. Double.parseDouble(currentTokenValue));
  622. <span class="keyword">break</span>;
  623. <span class="keyword">case</span> <span class="reference">RELATIVE_LENGTH</span>:
  624. prop = Ems.makeEms(node, property,
  625. Double.parseDouble(currentTokenValue));
  626. <span class="keyword">break</span>;
  627. <span class="keyword">case</span> <span class="reference">COLORSPEC</span>:
  628. prop = <span class="keyword">new</span> <span class="type">ColorType</span>(property, currentTokenValue);
  629. <span class="keyword">break</span>;
  630. <span class="keyword">case</span> <span class="reference">BOOL</span>:
  631. prop = <span class="keyword">new</span> <span class="type">Bool</span>(property, currentTokenValue);
  632. <span class="keyword">break</span>;
  633. <span class="keyword">case</span> <span class="reference">AUTO</span>:
  634. prop = <span class="keyword">new</span> <span class="type">Auto</span>(property);
  635. <span class="keyword">break</span>;
  636. <span class="keyword">case</span> <span class="reference">NONE</span>:
  637. prop = <span class="keyword">new</span> <span class="type">None</span>(property);
  638. <span class="keyword">break</span>;
  639. <span class="keyword">case</span> <span class="reference">INHERIT</span>:
  640. prop = <span class="keyword">new</span> <span class="type">Inherit</span>(property);
  641. <span class="comment">//throw new PropertyException(&quot;INHERIT not supported&quot;);
  642. </span> <span class="keyword">break</span>;
  643. <span class="keyword">case</span> <span class="reference">URI</span>:
  644. prop = <span class="keyword">new</span> <span class="type">UriType</span>(property, currentTokenValue);
  645. <span class="keyword">break</span>;
  646. <span class="keyword">case</span> <span class="reference">MIMETYPE</span>:
  647. prop = <span class="keyword">new</span> <span class="type">MimeType</span>(property, currentTokenValue);
  648. <span class="keyword">break</span>;
  649. <span class="keyword">case</span> <span class="reference">SLASH</span>:
  650. prop = <span class="keyword">new</span> <span class="type">Slash</span>(property);
  651. <span class="keyword">break</span>;
  652. <span class="keyword">case</span> <span class="reference">FUNCTION_LPAR</span>: {
  653. <span class="comment">// N.B. parseArgs() invokes expectRpar at the end of argument
  654. </span> <span class="comment">// processing, so, like LPAR processing, next() is not called
  655. </span> <span class="comment">// and the return from this method must be premature
  656. </span> prop = <span class="jde-java-font-lock-constant">null</span>;
  657. <span class="type">int</span> <span class="variable-name" id="funcType">funcType</span> = PropertyValue.<span class="jde-java-font-lock-constant" id="NO_TYPE">NO_TYPE</span>;
  658. <span class="type">String</span> <span class="variable-name" id="function">function</span> = currentTokenValue;
  659. next();
  660. <span class="keyword">do</span> {
  661. <span class="comment">// Numeric functions
  662. </span> <span class="keyword">if</span> (function.equals(&quot;<span class="string">floor</span>&quot;)) {
  663. <span class="type">PropertyValue</span>[] <span class="variable-name" id="args">args</span> = parseArgs(<span class="jde-java-font-lock-number">1</span>);
  664. <span class="keyword">switch</span> (args[<span class="jde-java-font-lock-number">0</span>].getType()) {
  665. <span class="keyword">case</span> <span class="reference">PropertyValue.INTEGER</span>:
  666. args[<span class="jde-java-font-lock-number">0</span>] =
  667. <span class="keyword">new</span> <span class="type">Numeric</span>
  668. (property, ((<span class="type">IntegerType</span>)args[<span class="jde-java-font-lock-number">0</span>]).getInt());
  669. <span class="keyword">case</span> <span class="reference">PropertyValue.NUMERIC</span>:
  670. prop = <span class="keyword">new</span> <span class="type">Numeric</span>
  671. (property, ((<span class="type">Numeric</span>)args[<span class="jde-java-font-lock-number">0</span>]).floor());
  672. <span class="keyword">break</span>;
  673. <span class="keyword">default</span>:
  674. <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>(funcNumericErrorStr());
  675. }
  676. <span class="keyword">break</span>;
  677. }
  678. <span class="keyword">if</span> (function.equals(&quot;<span class="string">ceiling</span>&quot;)) {
  679. <span class="type">PropertyValue</span>[] <span class="variable-name">args</span> = parseArgs(<span class="jde-java-font-lock-number">1</span>);
  680. <span class="keyword">switch</span> (args[<span class="jde-java-font-lock-number">0</span>].getType()) {
  681. <span class="keyword">case</span> <span class="reference">PropertyValue.INTEGER</span>:
  682. args[<span class="jde-java-font-lock-number">0</span>] =
  683. <span class="keyword">new</span> <span class="type">Numeric</span>
  684. (property, ((<span class="type">IntegerType</span>)args[<span class="jde-java-font-lock-number">0</span>]).getInt());
  685. <span class="keyword">case</span> <span class="reference">PropertyValue.NUMERIC</span>:
  686. prop = <span class="keyword">new</span> <span class="type">Numeric</span>
  687. (property, ((<span class="type">Numeric</span>)args[<span class="jde-java-font-lock-number">0</span>]).ceiling());
  688. <span class="keyword">break</span>;
  689. <span class="keyword">default</span>:
  690. <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>(funcNumericErrorStr());
  691. }
  692. <span class="keyword">break</span>;
  693. }
  694. <span class="keyword">if</span> (function.equals(&quot;<span class="string">round</span>&quot;)) {
  695. <span class="type">PropertyValue</span>[] <span class="variable-name">args</span> = parseArgs(<span class="jde-java-font-lock-number">1</span>);
  696. <span class="keyword">switch</span> (args[<span class="jde-java-font-lock-number">0</span>].getType()) {
  697. <span class="keyword">case</span> <span class="reference">PropertyValue.INTEGER</span>:
  698. args[<span class="jde-java-font-lock-number">0</span>] =
  699. <span class="keyword">new</span> <span class="type">Numeric</span>
  700. (property, ((<span class="type">IntegerType</span>)args[<span class="jde-java-font-lock-number">0</span>]).getInt());
  701. <span class="keyword">case</span> <span class="reference">PropertyValue.NUMERIC</span>:
  702. prop = <span class="keyword">new</span> <span class="type">Numeric</span>
  703. (property, ((<span class="type">Numeric</span>)args[<span class="jde-java-font-lock-number">0</span>]).round());
  704. <span class="keyword">break</span>;
  705. <span class="keyword">default</span>:
  706. <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>(funcNumericErrorStr());
  707. }
  708. <span class="keyword">break</span>;
  709. }
  710. <span class="keyword">if</span> (function.equals(&quot;<span class="string">min</span>&quot;)) {
  711. <span class="type">PropertyValue</span>[] <span class="variable-name">args</span> = parseArgs(<span class="jde-java-font-lock-number">2</span>);
  712. <span class="keyword">switch</span> (args[<span class="jde-java-font-lock-number">0</span>].getType()) {
  713. <span class="keyword">case</span> <span class="reference">PropertyValue.INTEGER</span>:
  714. args[<span class="jde-java-font-lock-number">0</span>] =
  715. <span class="keyword">new</span> <span class="type">Numeric</span>
  716. (property, ((<span class="type">IntegerType</span>)args[<span class="jde-java-font-lock-number">0</span>]).getInt());
  717. <span class="keyword">case</span> <span class="reference">PropertyValue.NUMERIC</span>:
  718. prop = ((<span class="type">Numeric</span>)args[<span class="jde-java-font-lock-number">0</span>]).min((<span class="type">Numeric</span>)args[<span class="jde-java-font-lock-number">1</span>]);
  719. <span class="keyword">break</span>;
  720. <span class="keyword">default</span>:
  721. <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>(funcNumericErrorStr());
  722. }
  723. <span class="keyword">break</span>;
  724. }
  725. <span class="keyword">if</span> (function.equals(&quot;<span class="string">max</span>&quot;)) {
  726. <span class="type">PropertyValue</span>[] <span class="variable-name">args</span> = parseArgs(<span class="jde-java-font-lock-number">2</span>);
  727. <span class="keyword">switch</span> (args[<span class="jde-java-font-lock-number">0</span>].getType()) {
  728. <span class="keyword">case</span> <span class="reference">PropertyValue.INTEGER</span>:
  729. args[<span class="jde-java-font-lock-number">0</span>] =
  730. <span class="keyword">new</span> <span class="type">Numeric</span>
  731. (property, ((<span class="type">IntegerType</span>)args[<span class="jde-java-font-lock-number">0</span>]).getInt());
  732. <span class="keyword">case</span> <span class="reference">PropertyValue.NUMERIC</span>:
  733. prop = ((<span class="type">Numeric</span>)args[<span class="jde-java-font-lock-number">0</span>]).max((<span class="type">Numeric</span>)args[<span class="jde-java-font-lock-number">1</span>]);
  734. <span class="keyword">break</span>;
  735. <span class="keyword">default</span>:
  736. <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>(funcNumericErrorStr());
  737. }
  738. <span class="keyword">break</span>;
  739. }
  740. <span class="keyword">if</span> (function.equals(&quot;<span class="string">abs</span>&quot;)) {
  741. <span class="type">PropertyValue</span>[] <span class="variable-name">args</span> = parseArgs(<span class="jde-java-font-lock-number">1</span>);
  742. <span class="keyword">switch</span> (args[<span class="jde-java-font-lock-number">0</span>].getType()) {
  743. <span class="keyword">case</span> <span class="reference">PropertyValue.INTEGER</span>:
  744. args[<span class="jde-java-font-lock-number">0</span>] =
  745. <span class="keyword">new</span> <span class="type">Numeric</span>
  746. (property, ((<span class="type">IntegerType</span>)args[<span class="jde-java-font-lock-number">0</span>]).getInt());
  747. <span class="keyword">case</span> <span class="reference">PropertyValue.NUMERIC</span>:
  748. prop = ((<span class="type">Numeric</span>)args[<span class="jde-java-font-lock-number">0</span>]).abs();
  749. <span class="keyword">break</span>;
  750. <span class="keyword">default</span>:
  751. <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>(funcNumericErrorStr());
  752. }
  753. <span class="keyword">break</span>;
  754. }
  755. <span class="comment">// Color functions
  756. </span> <span class="keyword">if</span> (function.equals(&quot;<span class="string">rgb</span>&quot;)) {
  757. <span class="comment">// Currently arguments must all be integers.
  758. </span> <span class="type">PropertyValue</span>[] <span class="variable-name">args</span> = parseArgs(<span class="jde-java-font-lock-number">3</span>);
  759. <span class="keyword">switch</span> (args[<span class="jde-java-font-lock-number">0</span>].getType()) {
  760. <span class="keyword">case</span> <span class="reference">PropertyValue.INTEGER</span>:
  761. prop = <span class="keyword">new</span> <span class="type">ColorType</span>
  762. (property, ((<span class="type">IntegerType</span>)args[<span class="jde-java-font-lock-number">0</span>]).getInt(),
  763. ((<span class="type">IntegerType</span>)args[<span class="jde-java-font-lock-number">1</span>]).getInt(),
  764. ((<span class="type">IntegerType</span>)args[<span class="jde-java-font-lock-number">2</span>]).getInt());
  765. <span class="keyword">break</span>;
  766. <span class="keyword">case</span> <span class="reference">PropertyValue.NUMERIC</span>:
  767. prop = <span class="keyword">new</span> <span class="type">ColorType</span>
  768. (property, ((<span class="type">Numeric</span>)args[<span class="jde-java-font-lock-number">0</span>]).asInt(),
  769. ((<span class="type">Numeric</span>)args[<span class="jde-java-font-lock-number">1</span>]).asInt(),
  770. ((<span class="type">Numeric</span>)args[<span class="jde-java-font-lock-number">2</span>]).asInt());
  771. <span class="keyword">break</span>;
  772. <span class="keyword">default</span>:
  773. <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>(funcNumericErrorStr());
  774. }
  775. <span class="keyword">break</span>;
  776. }
  777. <span class="keyword">if</span> (function.equals(&quot;<span class="string">rgb-icc</span>&quot;)) {
  778. <span class="type">PropertyValue</span>[] <span class="variable-name">args</span> = parseArgs(<span class="jde-java-font-lock-number">6</span>);
  779. <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">FunctionNotImplementedException</span>(&quot;<span class="string">rgb-icc</span>&quot;);
  780. <span class="comment">//break;
  781. </span> }
  782. <span class="keyword">if</span> (function.equals(&quot;<span class="string">system-color</span>&quot;)) {
  783. <span class="type">PropertyValue</span>[] <span class="variable-name">args</span> = parseArgs(<span class="jde-java-font-lock-number">1</span>);
  784. prop = <span class="keyword">new</span> <span class="type">ColorType</span>
  785. (property, ((<span class="type">StringType</span>)args[<span class="jde-java-font-lock-number">0</span>]).getString());
  786. <span class="keyword">break</span>;
  787. }
  788. <span class="comment">// Font function
  789. </span> <span class="keyword">if</span> (function.equals(&quot;<span class="string">system-font</span>&quot;)) {
  790. <span class="type">PropertyValue</span>[] <span class="variable-name">args</span> = parseArgs(<span class="jde-java-font-lock-number">1</span>, <span class="jde-java-font-lock-number">2</span>);
  791. <span class="keyword">if</span> (args.length == <span class="jde-java-font-lock-number">1</span>) {
  792. prop = SystemFontFunction.systemFontCharacteristic
  793. (property,
  794. ((<span class="type">StringType</span>)args[<span class="jde-java-font-lock-number">0</span>]).getString());
  795. } <span class="keyword">else</span> {
  796. <span class="comment">// 2 args
  797. </span> prop = SystemFontFunction.systemFontCharacteristic
  798. (property,
  799. ((<span class="type">StringType</span>)args[<span class="jde-java-font-lock-number">0</span>]).getString(),
  800. ((<span class="type">StringType</span>)args[<span class="jde-java-font-lock-number">1</span>]).getString());
  801. }
  802. <span class="keyword">break</span>;
  803. }
  804. <span class="comment">// Property value functions
  805. </span> <span class="keyword">if</span> (function.equals(&quot;<span class="string">label-end</span>&quot;)) {
  806. <span class="type">PropertyValue</span>[] <span class="variable-name">args</span> = parseArgs(<span class="jde-java-font-lock-number">0</span>);
  807. <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">FunctionNotImplementedException</span>(&quot;<span class="string">label-end</span>&quot;);
  808. <span class="comment">//break;
  809. </span> }
  810. <span class="keyword">if</span> (function.equals(&quot;<span class="string">body-start</span>&quot;)) {
  811. <span class="type">PropertyValue</span>[] <span class="variable-name">args</span> = parseArgs(<span class="jde-java-font-lock-number">0</span>);
  812. <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">FunctionNotImplementedException</span>(&quot;<span class="string">body-start</span>&quot;);
  813. <span class="comment">//break;
  814. </span> }
  815. <span class="keyword">if</span> (function.equals(&quot;<span class="string">inherited-property-value</span>&quot;)) {
  816. <span class="type">int</span> <span class="variable-name" id="propindex">propindex</span> = property;
  817. <span class="type">PropertyValue</span>[] <span class="variable-name">args</span> = parseArgs(<span class="jde-java-font-lock-number">0</span>, <span class="jde-java-font-lock-number">1</span>);
  818. <span class="keyword">if</span> (args.length != <span class="jde-java-font-lock-number">0</span>)
  819. propindex = PropNames.getPropertyIndex(
  820. ((<span class="type">StringType</span>)args[<span class="jde-java-font-lock-number">0</span>]).getString());
  821. <span class="comment">// If it's a compound, return an InheritedValue object
  822. </span> <span class="keyword">if</span> (PropertyConsts.pconsts.isCompound(propindex)) {
  823. prop = <span class="keyword">new</span> <span class="type">InheritedValue</span>(property, propindex);
  824. <span class="keyword">break</span>;
  825. }
  826. <span class="comment">// Is it an inherited property?
  827. </span> <span class="keyword">if</span> (PropertyConsts.pconsts.inheritance(propindex)
  828. == Property.<span class="jde-java-font-lock-constant" id="NO">NO</span>)
  829. <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>
  830. (&quot;<span class="string">inherited-property-value: </span>&quot;
  831. + PropNames.getPropertyName(propindex)
  832. + &quot;<span class="string"> is not inherited.</span>&quot;);
  833. <span class="comment">// Not a compound, and inherited - try to resolve it
  834. </span> prop = node.fromParent(property, propindex);
  835. <span class="keyword">break</span>;
  836. }
  837. <span class="comment">// N.B. see comments on classes FromNearestSpecified and
  838. </span> <span class="comment">// FromParent for explanation of this section
  839. </span> <span class="keyword">if</span> (function.equals(&quot;<span class="string">from-parent</span>&quot;))
  840. funcType = PropertyValue.<span class="jde-java-font-lock-constant" id="FROM_PARENT">FROM_PARENT</span>;
  841. <span class="keyword">if</span> (function.equals(&quot;<span class="string">from-nearest-specified-value</span>&quot;))
  842. funcType = PropertyValue.<span class="jde-java-font-lock-constant" id="FROM_NEAREST_SPECIFIED">FROM_NEAREST_SPECIFIED</span>;
  843. <span class="keyword">if</span> (funcType == <span class="reference">PropertyValue</span>.<span class="type">FROM_PARENT</span>
  844. || funcType == PropertyValue.<span class="jde-java-font-lock-constant">FROM_NEAREST_SPECIFIED</span>)
  845. {
  846. <span class="comment">// Preset the return value in case of a shorthand property
  847. </span> <span class="keyword">switch</span> (funcType) {
  848. <span class="keyword">case</span> <span class="reference">PropertyValue.FROM_PARENT</span>:
  849. prop = <span class="keyword">new</span> <span class="type">FromParent</span>(property);
  850. <span class="keyword">case</span> <span class="reference">PropertyValue.FROM_NEAREST_SPECIFIED</span>:
  851. prop = <span class="keyword">new</span> <span class="type">FromNearestSpecified</span>(property);
  852. }
  853. <span class="type">PropertyValue</span>[] <span class="variable-name">args</span> = parseArgs(<span class="jde-java-font-lock-number">0</span>, <span class="jde-java-font-lock-number">1</span>);
  854. <span class="keyword">if</span> (args.length == <span class="jde-java-font-lock-number">0</span>) {
  855. <span class="keyword">if</span> (! (PropertyConsts.pconsts.isShorthand(property)
  856. || PropertyConsts.pconsts.isCompound(property))) {
  857. <span class="comment">// develop the function value and return it as
  858. </span> <span class="comment">// a property.
  859. </span> <span class="keyword">switch</span> (funcType) {
  860. <span class="keyword">case</span> <span class="reference">PropertyValue.FROM_PARENT</span>:
  861. prop = node.fromParent(property);
  862. <span class="keyword">case</span> <span class="reference">PropertyValue.FROM_NEAREST_SPECIFIED</span>:
  863. prop = node.fromNearestSpecified(property);
  864. }
  865. }
  866. <span class="comment">// else a shorthand/compound - do nothing;
  867. </span> <span class="comment">// prop has been
  868. </span> <span class="comment">// set to the appropriate pseudo-propertyValue
  869. </span> } <span class="keyword">else</span> { <span class="comment">// one argument - it must be a property name
  870. </span> <span class="keyword">if</span> ( ! (args[<span class="jde-java-font-lock-number">0</span>] <span class="keyword">instanceof</span> <span class="type">NCName</span>))
  871. <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>
  872. (function + &quot;<span class="string"> function requires</span>&quot;
  873. + &quot;<span class="string"> property name arg.</span>&quot;);
  874. <span class="comment">// else arg[0] is an NCName
  875. </span> <span class="type">NCName</span> <span class="variable-name" id="ncname">ncname</span> = (<span class="type">NCName</span>)args[<span class="jde-java-font-lock-number">0</span>];
  876. <span class="type">String</span> <span class="variable-name" id="propname">propname</span> = ncname.getNCName();
  877. <span class="type">int</span> <span class="variable-name" id="nameindex">nameindex</span> =
  878. PropNames.getPropertyIndex(propname);
  879. <span class="keyword">if</span> (PropertyConsts.pconsts.isShorthand(nameindex)
  880. || PropertyConsts.pconsts.isCompound(nameindex)) {
  881. <span class="comment">// the argument is a shorthand/compound property -
  882. </span> <span class="comment">// it must be the same as the property being
  883. </span> <span class="comment">// assigned to.
  884. </span> <span class="comment">// see 5.10.4 Property Value Functions
  885. </span> <span class="keyword">if</span> ( ! (nameindex == property))
  886. <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>
  887. (function +
  888. &quot;<span class="string"> argument </span>&quot; + propname +
  889. &quot;<span class="string"> does not match property </span>&quot; +
  890. PropNames.getPropertyName(property));
  891. <span class="comment">// else perform shorthand/compound processing
  892. </span> <span class="comment">// i.e. do nothing;
  893. </span> <span class="comment">// prop has been set to the correct
  894. </span> <span class="comment">// pseudo-propertyValue
  895. </span> }
  896. <span class="keyword">else</span> { <span class="comment">// An NCName but not a shorthand/compound
  897. </span> <span class="comment">// Perform normal from-? processing
  898. </span> <span class="keyword">switch</span> (funcType) {
  899. <span class="keyword">case</span> <span class="reference">PropertyValue.FROM_PARENT</span>:
  900. prop = node.fromParent(property, nameindex);
  901. <span class="keyword">case</span> <span class="reference">PropertyValue.FROM_NEAREST_SPECIFIED</span>:
  902. prop = node.fromNearestSpecified
  903. (property, nameindex);
  904. }
  905. }
  906. }
  907. <span class="keyword">break</span>;
  908. }
  909. <span class="keyword">if</span> (function.equals(&quot;<span class="string">from-table-column</span>&quot;)) {
  910. <span class="type">PropertyValue</span>[] <span class="variable-name">args</span> = parseArgs(<span class="jde-java-font-lock-number">0</span>, <span class="jde-java-font-lock-number">1</span>);
  911. <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">FunctionNotImplementedException</span>
  912. (&quot;<span class="string">from-table-column</span>&quot;);
  913. <span class="comment">//break;
  914. </span> }
  915. <span class="keyword">if</span> (function.equals(&quot;<span class="string">proportional-column-width</span>&quot;)) {
  916. <span class="type">PropertyValue</span>[] <span class="variable-name">args</span> = parseArgs(<span class="jde-java-font-lock-number">1</span>);
  917. <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">FunctionNotImplementedException</span>
  918. (&quot;<span class="string">proportional-column-width</span>&quot;);
  919. <span class="comment">//break;
  920. </span> }
  921. <span class="keyword">if</span> (function.equals(&quot;<span class="string">merge-property-values</span>&quot;)) {
  922. <span class="type">PropertyValue</span>[] <span class="variable-name">args</span> = parseArgs(<span class="jde-java-font-lock-number">0</span>, <span class="jde-java-font-lock-number">1</span>);
  923. <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">FunctionNotImplementedException</span>
  924. (&quot;<span class="string">merge-property-values</span>&quot;);
  925. <span class="comment">//break;
  926. </span> }
  927. <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>(&quot;<span class="string">no such function: </span>&quot;
  928. + function);
  929. } <span class="keyword">while</span> (<span class="jde-java-font-lock-constant" id="false">false</span>);
  930. <span class="keyword">return</span> prop;
  931. }
  932. <span class="keyword">default</span>:
  933. <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>(&quot;<span class="string">syntax error</span>&quot;);
  934. }
  935. next();
  936. <span class="keyword">return</span> prop;
  937. }
  938. <span class="comment">/**
  939. * Parse a comma separated list of function arguments. Each argument
  940. * may itself be an expression. This method consumes the closing right
  941. * parenthesis of the argument list.
  942. * </span><span class="jde-java-font-lock-doc-tag">@param</span><span class="comment"> </span><span class="variable-name" id="nbArgs">nbArgs</span><span class="comment"> The number of arguments expected by the function.
  943. * </span><span class="jde-java-font-lock-doc-tag">@return</span><span class="comment"> &lt;tt&gt;PropertyValueList&lt;/tt&gt; of &lt;tt&gt;PropertyValue&lt;/tt&gt; objects
  944. * representing the arguments found.
  945. * </span><span class="jde-java-font-lock-doc-tag">@exception</span><span class="comment"> </span><span class="type">PropertyException
  946. </span><span class="comment"> */</span>
  947. <span class="type">PropertyValue</span>[] <span class="function-name" id="parseArgs">parseArgs</span>(<span class="type">int</span> <span class="variable-name">nbArgs</span>) <span class="keyword">throws</span> <span class="type">PropertyException</span> {
  948. <span class="keyword">return</span> parseArgs(nbArgs, nbArgs);
  949. }
  950. <span class="comment">/**
  951. * Parse a comma separated list of function arguments. Each argument
  952. * may itself be an expression. This method consumes the closing right
  953. * parenthesis of the argument list.
  954. * </span><span class="jde-java-font-lock-doc-tag">@param</span><span class="comment"> </span><span class="variable-name" id="minArgs">minArgs</span><span class="comment"> The minimum number of arguments expected by the function.
  955. * </span><span class="jde-java-font-lock-doc-tag">@param</span><span class="comment"> </span><span class="variable-name" id="maxArgs">maxArgs</span><span class="comment"> The maximum number of arguments expected by the function.
  956. * </span><span class="jde-java-font-lock-doc-tag">@return</span><span class="comment"> &lt;tt&gt;PropertyValueList&lt;/tt&gt; of &lt;tt&gt;PropertyValue&lt;/tt&gt; objects
  957. * representing the arguments found. N.B. The actual number of arguments
  958. * returned is guaranteed to be between minArgs and maxArgs, inclusive,
  959. * but the actual list of args found is terminated by the end of the
  960. * array, or the first null element.
  961. * </span><span class="jde-java-font-lock-doc-tag">@exception</span><span class="comment"> </span><span class="type">PropertyException
  962. </span><span class="comment"> */</span>
  963. <span class="type">PropertyValue</span>[] <span class="function-name">parseArgs</span>(<span class="type">int</span> <span class="variable-name">minArgs</span>, <span class="type">int</span> <span class="variable-name">maxArgs</span>)
  964. <span class="keyword">throws</span> <span class="type">PropertyException</span>
  965. {
  966. <span class="type">PropertyValue</span>[] <span class="variable-name">args</span> = <span class="keyword">new</span> <span class="type">PropertyValue</span>[maxArgs];
  967. <span class="type">PropertyValue</span> <span class="variable-name">prop</span>;
  968. <span class="type">int</span> <span class="variable-name" id="i">i</span> = <span class="jde-java-font-lock-number">0</span>;
  969. <span class="keyword">if</span> (currentToken == <span class="jde-java-font-lock-constant">RPAR</span>) {
  970. <span class="comment">// No args: func()
  971. </span> next();
  972. } <span class="keyword">else</span> {
  973. <span class="keyword">while</span> (<span class="jde-java-font-lock-constant">true</span>) {
  974. prop = parseAdditiveExpr();
  975. <span class="keyword">if</span> (i &lt; maxArgs) {
  976. args[i++] = prop;
  977. }
  978. <span class="comment">// ignore extra args
  979. </span> <span class="keyword">if</span> (currentToken != <span class="jde-java-font-lock-constant">COMMA</span>)
  980. <span class="keyword">break</span>;
  981. next();
  982. }
  983. expectRpar();
  984. }
  985. <span class="keyword">if</span> (minArgs &gt; i || i &gt; maxArgs) {
  986. <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>(&quot;<span class="string">Wrong number of args for function</span>&quot;);
  987. }
  988. <span class="keyword">return</span> args;
  989. }
  990. }
  991. </pre>
  992. </body>
  993. </html>