parser.y 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. %{
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include "expression.h"
  5. #include "lexer.h"
  6. #include "filter.h"
  7. void yyerror(const char *str)
  8. {
  9. fprintf(stderr,"Parse error: %s\n",str);
  10. }
  11. int yywrap()
  12. {
  13. return 1;
  14. }
  15. extern node_t *zfilter;
  16. %}
  17. %union {
  18. int int_literal;
  19. char *string_literal;
  20. struct node_st *expr;
  21. }
  22. %token '(' ')' T_AND T_OR
  23. %token <int_literal> T_NUMBER
  24. %token <string_literal> T_FIELD
  25. %token T_NOT_EQ T_GT_EQ '>' '<' '=' T_LT_EQ
  26. %left T_OR
  27. %left T_AND
  28. %type <expr> filter
  29. %type <expr> number_filter
  30. %type <expr> string_filter
  31. %type <expr> filter_expr
  32. %%
  33. expression: filter_expr
  34. {
  35. zfilter = $1;
  36. }
  37. filter_expr:
  38. filter_expr T_OR filter_expr
  39. {
  40. $$ = make_op_node(OR);
  41. $$->left_child = $1;
  42. $$->right_child = $3;
  43. }
  44. | filter_expr T_AND filter_expr
  45. {
  46. $$ = make_op_node(AND);
  47. $$->left_child = $1;
  48. $$->right_child = $3;
  49. }
  50. | '(' filter_expr ')'
  51. {
  52. $$ = $2;
  53. }
  54. | filter
  55. {
  56. $$ = $1;
  57. }
  58. ;
  59. filter: number_filter
  60. {
  61. $$ = $1;
  62. }
  63. | string_filter
  64. {
  65. $$ = $1;
  66. }
  67. ;
  68. number_filter: T_FIELD '=' T_NUMBER
  69. {
  70. $$ = make_op_node(EQ);
  71. $$->left_child = make_field_node($1);
  72. $$->right_child = make_int_node($3);
  73. }
  74. |
  75. T_FIELD '>' T_NUMBER
  76. {
  77. $$ = make_op_node(GT);
  78. $$->left_child = make_field_node($1);
  79. $$->right_child = make_int_node($3);
  80. }
  81. |
  82. T_FIELD '<' T_NUMBER
  83. {
  84. $$ = make_op_node(LT);
  85. $$->left_child = make_field_node($1);
  86. $$->right_child = make_int_node($3);
  87. }
  88. |
  89. T_FIELD T_NOT_EQ T_NUMBER
  90. {
  91. $$ = make_op_node(NEQ);
  92. $$->left_child = make_field_node($1);
  93. $$->right_child = make_int_node($3);
  94. }
  95. |
  96. T_FIELD T_GT_EQ T_NUMBER
  97. {
  98. $$ = make_op_node(GT_EQ);
  99. $$->left_child = make_field_node($1);
  100. $$->right_child = make_int_node($3);
  101. }
  102. |
  103. T_FIELD T_LT_EQ T_NUMBER
  104. {
  105. $$ = make_op_node(LT_EQ);
  106. $$->left_child = make_field_node($1);
  107. $$->right_child = make_int_node($3);
  108. }
  109. ;
  110. string_filter:
  111. T_FIELD '=' T_FIELD
  112. {
  113. $$ = make_op_node(EQ);
  114. $$->left_child = make_field_node($1);
  115. $$->right_child = make_string_node($3);
  116. }
  117. |
  118. T_FIELD T_NOT_EQ T_FIELD
  119. {
  120. $$ = make_op_node(NEQ);
  121. $$->left_child = make_field_node($1);
  122. $$->right_child = make_string_node($3);
  123. }
  124. ;
  125. %%