parser.y 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. /*
  2. * Copyright (C) 2013-2014 Jo-Philipp Wich <jo@mein.io>
  3. *
  4. * Permission to use, copy, modify, and/or distribute this software for any
  5. * purpose with or without fee is hereby granted, provided that the above
  6. * copyright notice and this permission notice appear in all copies.
  7. *
  8. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  9. * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  10. * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  11. * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  12. * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  13. * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  14. * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  15. */
  16. %token_type {struct jp_opcode *}
  17. %extra_argument {struct jp_state *s}
  18. %left T_AND.
  19. %left T_OR.
  20. %left T_UNION.
  21. %nonassoc T_EQ T_NE T_GT T_GE T_LT T_LE T_MATCH.
  22. %right T_NOT.
  23. %include {
  24. #include <assert.h>
  25. #include <stddef.h>
  26. #include <stdlib.h>
  27. #include <string.h>
  28. #include "ast.h"
  29. #include "lexer.h"
  30. #include "parser.h"
  31. #define alloc_op(type, num, str, ...) \
  32. jp_alloc_op(s, type, num, str, ##__VA_ARGS__, NULL)
  33. }
  34. %syntax_error {
  35. int i;
  36. for (i = 0; i < sizeof(tokennames) / sizeof(tokennames[0]); i++)
  37. if (yy_find_shift_action(yypParser, (YYCODETYPE)i) < YYNSTATE + YYNRULE)
  38. s->error_code |= (1 << i);
  39. s->error_pos = s->off;
  40. }
  41. input ::= expr(A). { s->path = A; }
  42. expr(A) ::= T_LABEL(B) T_EQ path(C). { A = B; B->down = C; }
  43. expr(A) ::= path(B). { A = B; }
  44. path(A) ::= T_ROOT segments(B). { A = alloc_op(T_ROOT, 0, NULL, B); }
  45. path(A) ::= T_THIS segments(B). { A = alloc_op(T_THIS, 0, NULL, B); }
  46. path(A) ::= T_ROOT(B). { A = B; }
  47. path(A) ::= T_THIS(B). { A = B; }
  48. segments(A) ::= segments(B) segment(C). { A = append_op(B, C); }
  49. segments(A) ::= segment(B). { A = B; }
  50. segment(A) ::= T_DOT T_LABEL(B). { A = B; }
  51. segment(A) ::= T_DOT T_WILDCARD(B). { A = B; }
  52. segment(A) ::= T_BROPEN union_exps(B) T_BRCLOSE. { A = B; }
  53. union_exps(A) ::= union_exp(B). { A = B->sibling ? alloc_op(T_UNION, 0, NULL, B) : B; }
  54. union_exp(A) ::= union_exp(B) T_UNION or_exps(C). { A = append_op(B, C); }
  55. union_exp(A) ::= or_exps(B). { A = B; }
  56. or_exps(A) ::= or_exp(B). { A = B->sibling ? alloc_op(T_OR, 0, NULL, B) : B; }
  57. or_exp(A) ::= or_exp(B) T_OR and_exps(C). { A = append_op(B, C); }
  58. or_exp(A) ::= and_exps(B). { A = B; }
  59. and_exps(A) ::= and_exp(B). { A = B->sibling ? alloc_op(T_AND, 0, NULL, B) : B; }
  60. and_exp(A) ::= and_exp(B) T_AND cmp_exp(C). { A = append_op(B, C); }
  61. and_exp(A) ::= cmp_exp(B). { A = B; }
  62. cmp_exp(A) ::= unary_exp(B) T_LT unary_exp(C). { A = alloc_op(T_LT, 0, NULL, B, C); }
  63. cmp_exp(A) ::= unary_exp(B) T_LE unary_exp(C). { A = alloc_op(T_LE, 0, NULL, B, C); }
  64. cmp_exp(A) ::= unary_exp(B) T_GT unary_exp(C). { A = alloc_op(T_GT, 0, NULL, B, C); }
  65. cmp_exp(A) ::= unary_exp(B) T_GE unary_exp(C). { A = alloc_op(T_GE, 0, NULL, B, C); }
  66. cmp_exp(A) ::= unary_exp(B) T_EQ unary_exp(C). { A = alloc_op(T_EQ, 0, NULL, B, C); }
  67. cmp_exp(A) ::= unary_exp(B) T_NE unary_exp(C). { A = alloc_op(T_NE, 0, NULL, B, C); }
  68. cmp_exp(A) ::= unary_exp(B) T_MATCH unary_exp(C). { A = alloc_op(T_MATCH, 0, NULL, B, C); }
  69. cmp_exp(A) ::= unary_exp(B). { A = B; }
  70. unary_exp(A) ::= T_BOOL(B). { A = B; }
  71. unary_exp(A) ::= T_NUMBER(B). { A = B; }
  72. unary_exp(A) ::= T_STRING(B). { A = B; }
  73. unary_exp(A) ::= T_REGEXP(B). { A = B; }
  74. unary_exp(A) ::= T_WILDCARD(B). { A = B; }
  75. unary_exp(A) ::= T_POPEN or_exps(B) T_PCLOSE. { A = B; }
  76. unary_exp(A) ::= T_NOT unary_exp(B). { A = alloc_op(T_NOT, 0, NULL, B); }
  77. unary_exp(A) ::= path(B). { A = B; }