PageRenderTime 56ms CodeModel.GetById 26ms RepoModel.GetById 0ms app.codeStats 0ms

/libformula-1.1.3/source/org/pentaho/reporting/libraries/formula/parser/GeneratedFormulaParser.java

#
Java | 558 lines | 522 code | 33 blank | 3 comment | 63 complexity | 6ac6bd1e2f5bfbca3f55886a19805beb MD5 | raw file
Possible License(s): LGPL-2.1
  1. /* Generated By:JavaCC: Do not edit this line. GeneratedFormulaParser.java */
  2. package org.pentaho.reporting.libraries.formula.parser;
  3. import java.math.BigDecimal;
  4. import java.util.ArrayList;
  5. import org.pentaho.reporting.libraries.formula.lvalues.ContextLookup;
  6. import org.pentaho.reporting.libraries.formula.lvalues.FormulaFunction;
  7. import org.pentaho.reporting.libraries.formula.lvalues.LValue;
  8. import org.pentaho.reporting.libraries.formula.lvalues.PostfixTerm;
  9. import org.pentaho.reporting.libraries.formula.lvalues.PrefixTerm;
  10. import org.pentaho.reporting.libraries.formula.lvalues.StaticValue;
  11. import org.pentaho.reporting.libraries.formula.lvalues.Term;
  12. import org.pentaho.reporting.libraries.formula.lvalues.DefaultDataTable;
  13. import org.pentaho.reporting.libraries.formula.operators.InfixOperator;
  14. import org.pentaho.reporting.libraries.formula.operators.OperatorFactory;
  15. import org.pentaho.reporting.libraries.formula.operators.PostfixOperator;
  16. import org.pentaho.reporting.libraries.formula.operators.PrefixOperator;
  17. import org.pentaho.reporting.libraries.formula.typing.coretypes.NumberType;
  18. import org.pentaho.reporting.libraries.formula.typing.coretypes.TextType;
  19. import org.pentaho.reporting.libraries.formula.lvalues.ParsePosition;
  20. public abstract class GeneratedFormulaParser implements GeneratedFormulaParserConstants {
  21. protected GeneratedFormulaParser ()
  22. {
  23. }
  24. protected abstract OperatorFactory getOperatorFactory();
  25. protected ParsePosition createPosition(Token token)
  26. {
  27. return new ParsePosition
  28. (token.beginLine, token.beginColumn, token.endLine, token.endColumn);
  29. }
  30. final public LValue getExpression() throws ParseException {
  31. LValue retval = null;
  32. Term term = null;
  33. retval = getLValue();
  34. switch (jj_nt.kind) {
  35. case PLUS:
  36. case MINUS:
  37. case MULT:
  38. case DIV:
  39. case POW:
  40. case EQUALS:
  41. case NOT_EQUALS:
  42. case LT_EQUALS:
  43. case GT_EQUALS:
  44. case LT:
  45. case GT:
  46. case CONCAT:
  47. term = startTail(new Term(retval));
  48. label_1:
  49. while (true) {
  50. switch (jj_nt.kind) {
  51. case PLUS:
  52. case MINUS:
  53. case MULT:
  54. case DIV:
  55. case POW:
  56. case EQUALS:
  57. case NOT_EQUALS:
  58. case LT_EQUALS:
  59. case GT_EQUALS:
  60. case LT:
  61. case GT:
  62. case CONCAT:
  63. ;
  64. break;
  65. default:
  66. jj_la1[0] = jj_gen;
  67. break label_1;
  68. }
  69. term = startTail(term);
  70. }
  71. break;
  72. default:
  73. jj_la1[1] = jj_gen;
  74. ;
  75. }
  76. if (term != null)
  77. {
  78. {if (true) return term;}
  79. }
  80. {if (true) return retval;}
  81. throw new Error("Missing return statement in function");
  82. }
  83. final public Term startTail(LValue retval) throws ParseException {
  84. LValue val = null;
  85. InfixOperator op = null;
  86. Term ex = null;
  87. op = getInfixOperator();
  88. val = getLValue();
  89. if (retval instanceof Term)
  90. {
  91. ex = (Term) retval;
  92. }
  93. else
  94. {
  95. ex = new Term (retval);
  96. }
  97. ex.add (op, val);
  98. {if (true) return ex;}
  99. throw new Error("Missing return statement in function");
  100. }
  101. final public LValue getLValue() throws ParseException {
  102. Token value = null;
  103. LValue retval = null;
  104. PrefixOperator prefixOp = null;
  105. PostfixOperator postfixOp = null;
  106. switch (jj_nt.kind) {
  107. case PLUS:
  108. case MINUS:
  109. prefixOp = getPrefixOperator();
  110. break;
  111. default:
  112. jj_la1[2] = jj_gen;
  113. ;
  114. }
  115. switch (jj_nt.kind) {
  116. case COLUMN_LOOKUP:
  117. value = jj_consume_token(COLUMN_LOOKUP);
  118. retval = new ContextLookup (ParserTools.stripReferenceQuote(value.image), createPosition(value));
  119. break;
  120. case STRING_LITERAL:
  121. value = jj_consume_token(STRING_LITERAL);
  122. retval = new StaticValue (ParserTools.stripQuote(value.image), TextType.TYPE, createPosition(value));
  123. break;
  124. case UNSIGNED_NUMERIC_LITERAL:
  125. value = jj_consume_token(UNSIGNED_NUMERIC_LITERAL);
  126. retval = new StaticValue (new BigDecimal (value.image), NumberType.GENERIC_NUMBER, createPosition(value));
  127. break;
  128. case UNSIGNED_INTEGER:
  129. value = jj_consume_token(UNSIGNED_INTEGER);
  130. retval = new StaticValue (new BigDecimal (value.image), NumberType.GENERIC_NUMBER, createPosition(value));
  131. break;
  132. case NULL:
  133. jj_consume_token(NULL);
  134. retval = new StaticValue (null, createPosition(value));
  135. break;
  136. case L_BRACE:
  137. jj_consume_token(L_BRACE);
  138. retval = parseArray();
  139. jj_consume_token(R_BRACE);
  140. break;
  141. case IDENTIFIER:
  142. value = jj_consume_token(IDENTIFIER);
  143. jj_consume_token(L_PAREN);
  144. retval = parseFunction(value.image, createPosition(value));
  145. jj_consume_token(R_PAREN);
  146. break;
  147. case L_PAREN:
  148. jj_consume_token(L_PAREN);
  149. retval = getExpression ();
  150. jj_consume_token(R_PAREN);
  151. if (retval instanceof Term == false)
  152. {
  153. retval = new Term (retval);
  154. }
  155. break;
  156. default:
  157. jj_la1[3] = jj_gen;
  158. jj_consume_token(-1);
  159. throw new ParseException();
  160. }
  161. switch (jj_nt.kind) {
  162. case PERCENT:
  163. postfixOp = getPostfixOperator();
  164. break;
  165. default:
  166. jj_la1[4] = jj_gen;
  167. ;
  168. }
  169. if (postfixOp != null)
  170. {
  171. retval = new PostfixTerm(retval, postfixOp);
  172. }
  173. if (prefixOp != null)
  174. {
  175. retval = new PrefixTerm(prefixOp, retval);
  176. }
  177. {if (true) return retval;}
  178. throw new Error("Missing return statement in function");
  179. }
  180. final public LValue parseArray() throws ParseException {
  181. ArrayList rows = new ArrayList();
  182. LValue[] row = null;
  183. row = parseRow();
  184. rows.add(row);
  185. label_2:
  186. while (true) {
  187. switch (jj_nt.kind) {
  188. case PIPE:
  189. ;
  190. break;
  191. default:
  192. jj_la1[5] = jj_gen;
  193. break label_2;
  194. }
  195. jj_consume_token(PIPE);
  196. row = parseRow();
  197. // should we check here for column count equality to the first row column count?
  198. // or do we give this responsability to a DefaultDataTable constructor?
  199. rows.add(row);
  200. }
  201. LValue[][] table = (LValue[][])rows.toArray(new LValue[rows.size()][]);
  202. {if (true) return new DefaultDataTable(table);}
  203. throw new Error("Missing return statement in function");
  204. }
  205. final public LValue[] parseRow() throws ParseException {
  206. ArrayList cols = new ArrayList();;
  207. LValue column = null;
  208. column = getExpression();
  209. cols.add(column);
  210. label_3:
  211. while (true) {
  212. switch (jj_nt.kind) {
  213. case SEMICOLON:
  214. ;
  215. break;
  216. default:
  217. jj_la1[6] = jj_gen;
  218. break label_3;
  219. }
  220. jj_consume_token(SEMICOLON);
  221. column = getExpression();
  222. cols.add(column);
  223. }
  224. {if (true) return (LValue[]) cols.toArray(new LValue[cols.size()]);}
  225. throw new Error("Missing return statement in function");
  226. }
  227. final public LValue parseFunction(String name, ParsePosition parsePosition) throws ParseException {
  228. ArrayList params = new ArrayList();
  229. LValue parameter = null;
  230. Token value = null;
  231. boolean parameterExpected = false;
  232. switch (jj_nt.kind) {
  233. case UNSIGNED_INTEGER:
  234. case SEMICOLON:
  235. case L_PAREN:
  236. case L_BRACE:
  237. case PLUS:
  238. case MINUS:
  239. case IDENTIFIER:
  240. case COLUMN_LOOKUP:
  241. case STRING_LITERAL:
  242. case UNSIGNED_NUMERIC_LITERAL:
  243. case NULL:
  244. switch (jj_nt.kind) {
  245. case SEMICOLON:
  246. value = jj_consume_token(SEMICOLON);
  247. parameterExpected = false;
  248. params.add(new StaticValue(null, createPosition(value)));
  249. break;
  250. case UNSIGNED_INTEGER:
  251. case L_PAREN:
  252. case L_BRACE:
  253. case PLUS:
  254. case MINUS:
  255. case IDENTIFIER:
  256. case COLUMN_LOOKUP:
  257. case STRING_LITERAL:
  258. case UNSIGNED_NUMERIC_LITERAL:
  259. case NULL:
  260. parameter = getExpression();
  261. parameterExpected = false;
  262. params.add(parameter);
  263. break;
  264. default:
  265. jj_la1[7] = jj_gen;
  266. jj_consume_token(-1);
  267. throw new ParseException();
  268. }
  269. label_4:
  270. while (true) {
  271. switch (jj_nt.kind) {
  272. case SEMICOLON:
  273. ;
  274. break;
  275. default:
  276. jj_la1[8] = jj_gen;
  277. break label_4;
  278. }
  279. value = jj_consume_token(SEMICOLON);
  280. if (parameterExpected == true)
  281. {
  282. params.add(new StaticValue(null, createPosition(value)));
  283. }
  284. parameterExpected = true;
  285. switch (jj_nt.kind) {
  286. case UNSIGNED_INTEGER:
  287. case L_PAREN:
  288. case L_BRACE:
  289. case PLUS:
  290. case MINUS:
  291. case IDENTIFIER:
  292. case COLUMN_LOOKUP:
  293. case STRING_LITERAL:
  294. case UNSIGNED_NUMERIC_LITERAL:
  295. case NULL:
  296. parameter = getExpression();
  297. params.add(parameter);
  298. parameterExpected = false;
  299. break;
  300. default:
  301. jj_la1[9] = jj_gen;
  302. ;
  303. }
  304. }
  305. break;
  306. default:
  307. jj_la1[10] = jj_gen;
  308. ;
  309. }
  310. if (parameterExpected == true)
  311. {
  312. params.add(new StaticValue(null, createPosition(value)));
  313. }
  314. if (params == null)
  315. {
  316. {if (true) return new FormulaFunction(name, new LValue[0], parsePosition);}
  317. }
  318. LValue[] paramVals = (LValue[]) params.toArray(new LValue[params.size()]);
  319. {if (true) return new FormulaFunction(name, paramVals, parsePosition);}
  320. throw new Error("Missing return statement in function");
  321. }
  322. final public PrefixOperator getPrefixOperator() throws ParseException {
  323. Token value = null;
  324. switch (jj_nt.kind) {
  325. case PLUS:
  326. value = jj_consume_token(PLUS);
  327. break;
  328. case MINUS:
  329. value = jj_consume_token(MINUS);
  330. break;
  331. default:
  332. jj_la1[11] = jj_gen;
  333. jj_consume_token(-1);
  334. throw new ParseException();
  335. }
  336. {if (true) return getOperatorFactory().createPrefixOperator(value.image);}
  337. throw new Error("Missing return statement in function");
  338. }
  339. final public PostfixOperator getPostfixOperator() throws ParseException {
  340. Token value = null;
  341. value = jj_consume_token(PERCENT);
  342. {if (true) return getOperatorFactory().createPostfixOperator(value.image);}
  343. throw new Error("Missing return statement in function");
  344. }
  345. final public InfixOperator getInfixOperator() throws ParseException {
  346. InfixOperator op = null;
  347. Token value = null;
  348. switch (jj_nt.kind) {
  349. case PLUS:
  350. value = jj_consume_token(PLUS);
  351. break;
  352. case MINUS:
  353. value = jj_consume_token(MINUS);
  354. break;
  355. case MULT:
  356. value = jj_consume_token(MULT);
  357. break;
  358. case DIV:
  359. value = jj_consume_token(DIV);
  360. break;
  361. case POW:
  362. value = jj_consume_token(POW);
  363. break;
  364. case EQUALS:
  365. value = jj_consume_token(EQUALS);
  366. break;
  367. case NOT_EQUALS:
  368. value = jj_consume_token(NOT_EQUALS);
  369. break;
  370. case LT_EQUALS:
  371. value = jj_consume_token(LT_EQUALS);
  372. break;
  373. case GT_EQUALS:
  374. value = jj_consume_token(GT_EQUALS);
  375. break;
  376. case LT:
  377. value = jj_consume_token(LT);
  378. break;
  379. case GT:
  380. value = jj_consume_token(GT);
  381. break;
  382. case CONCAT:
  383. value = jj_consume_token(CONCAT);
  384. break;
  385. default:
  386. jj_la1[12] = jj_gen;
  387. jj_consume_token(-1);
  388. throw new ParseException();
  389. }
  390. {if (true) return getOperatorFactory().createInfixOperator(value.image);}
  391. throw new Error("Missing return statement in function");
  392. }
  393. public GeneratedFormulaParserTokenManager token_source;
  394. JavaCharStream jj_input_stream;
  395. public Token token, jj_nt;
  396. private int jj_gen;
  397. final private int[] jj_la1 = new int[13];
  398. static private int[] jj_la1_0;
  399. static private int[] jj_la1_1;
  400. static {
  401. jj_la1_0();
  402. jj_la1_1();
  403. }
  404. private static void jj_la1_0() {
  405. jj_la1_0 = new int[] {0xf8000000,0xf8000000,0x18000000,0x1080100,0x0,0x4000000,0x40000,0x190c0100,0x40000,0x19080100,0x190c0100,0x18000000,0xf8000000,};
  406. }
  407. private static void jj_la1_1() {
  408. jj_la1_1 = new int[] {0x7f,0x7f,0x0,0x10f00,0x80,0x0,0x0,0x10f00,0x0,0x10f00,0x10f00,0x0,0x7f,};
  409. }
  410. public GeneratedFormulaParser(java.io.InputStream stream) {
  411. jj_input_stream = new JavaCharStream(stream, 1, 1);
  412. token_source = new GeneratedFormulaParserTokenManager(jj_input_stream);
  413. token = new Token();
  414. token.next = jj_nt = token_source.getNextToken();
  415. jj_gen = 0;
  416. for (int i = 0; i < 13; i++) jj_la1[i] = -1;
  417. }
  418. public void ReInit(java.io.InputStream stream) {
  419. jj_input_stream.ReInit(stream, 1, 1);
  420. token_source.ReInit(jj_input_stream);
  421. token = new Token();
  422. token.next = jj_nt = token_source.getNextToken();
  423. jj_gen = 0;
  424. for (int i = 0; i < 13; i++) jj_la1[i] = -1;
  425. }
  426. public GeneratedFormulaParser(java.io.Reader stream) {
  427. jj_input_stream = new JavaCharStream(stream, 1, 1);
  428. token_source = new GeneratedFormulaParserTokenManager(jj_input_stream);
  429. token = new Token();
  430. token.next = jj_nt = token_source.getNextToken();
  431. jj_gen = 0;
  432. for (int i = 0; i < 13; i++) jj_la1[i] = -1;
  433. }
  434. public void ReInit(java.io.Reader stream) {
  435. jj_input_stream.ReInit(stream, 1, 1);
  436. token_source.ReInit(jj_input_stream);
  437. token = new Token();
  438. token.next = jj_nt = token_source.getNextToken();
  439. jj_gen = 0;
  440. for (int i = 0; i < 13; i++) jj_la1[i] = -1;
  441. }
  442. public GeneratedFormulaParser(GeneratedFormulaParserTokenManager tm) {
  443. token_source = tm;
  444. token = new Token();
  445. token.next = jj_nt = token_source.getNextToken();
  446. jj_gen = 0;
  447. for (int i = 0; i < 13; i++) jj_la1[i] = -1;
  448. }
  449. public void ReInit(GeneratedFormulaParserTokenManager tm) {
  450. token_source = tm;
  451. token = new Token();
  452. token.next = jj_nt = token_source.getNextToken();
  453. jj_gen = 0;
  454. for (int i = 0; i < 13; i++) jj_la1[i] = -1;
  455. }
  456. final private Token jj_consume_token(int kind) throws ParseException {
  457. Token oldToken = token;
  458. if ((token = jj_nt).next != null) jj_nt = jj_nt.next;
  459. else jj_nt = jj_nt.next = token_source.getNextToken();
  460. if (token.kind == kind) {
  461. jj_gen++;
  462. return token;
  463. }
  464. jj_nt = token;
  465. token = oldToken;
  466. jj_kind = kind;
  467. throw generateParseException();
  468. }
  469. final public Token getNextToken() {
  470. if ((token = jj_nt).next != null) jj_nt = jj_nt.next;
  471. else jj_nt = jj_nt.next = token_source.getNextToken();
  472. jj_gen++;
  473. return token;
  474. }
  475. final public Token getToken(int index) {
  476. Token t = token;
  477. for (int i = 0; i < index; i++) {
  478. if (t.next != null) t = t.next;
  479. else t = t.next = token_source.getNextToken();
  480. }
  481. return t;
  482. }
  483. private java.util.Vector jj_expentries = new java.util.Vector();
  484. private int[] jj_expentry;
  485. private int jj_kind = -1;
  486. public ParseException generateParseException() {
  487. jj_expentries.removeAllElements();
  488. boolean[] la1tokens = new boolean[49];
  489. for (int i = 0; i < 49; i++) {
  490. la1tokens[i] = false;
  491. }
  492. if (jj_kind >= 0) {
  493. la1tokens[jj_kind] = true;
  494. jj_kind = -1;
  495. }
  496. for (int i = 0; i < 13; i++) {
  497. if (jj_la1[i] == jj_gen) {
  498. for (int j = 0; j < 32; j++) {
  499. if ((jj_la1_0[i] & (1<<j)) != 0) {
  500. la1tokens[j] = true;
  501. }
  502. if ((jj_la1_1[i] & (1<<j)) != 0) {
  503. la1tokens[32+j] = true;
  504. }
  505. }
  506. }
  507. }
  508. for (int i = 0; i < 49; i++) {
  509. if (la1tokens[i]) {
  510. jj_expentry = new int[1];
  511. jj_expentry[0] = i;
  512. jj_expentries.addElement(jj_expentry);
  513. }
  514. }
  515. int[][] exptokseq = new int[jj_expentries.size()][];
  516. for (int i = 0; i < jj_expentries.size(); i++) {
  517. exptokseq[i] = (int[])jj_expentries.elementAt(i);
  518. }
  519. return new ParseException(token, exptokseq, tokenImage);
  520. }
  521. final public void enable_tracing() {
  522. }
  523. final public void disable_tracing() {
  524. }
  525. }