parser.par 2.96 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
/~ Token definitions ~/

! ' |\t' ;

' |\t' WHITESPACE ;
'\(' LEFT_PARENTHESE ;
'\)' RIGHT_PARENTHESE ;
'AND' AND ;
'OR' OR ;
'NOT' NOT ;
'[^><= :\(\)"][^ :\(\)"]*:' COLUMN ;
'"(\\.|[^\\"])*"' STRING ;
'[^><= :\(\)"][^ :\(\)"]*' WORD ;
'(>=?|<=?|!?=)' OPERATOR ;

##

/~ Grammar specification ~/

begin: search_text [* result = %1; *];

search_text
    : and_expression                [* %% = %1; *]
    | and_expression search_text    [* %% = mkComplexQuery('OR',[%1,%2]); *]
    | and_expression OR search_text [* %% = mkComplexQuery('OR',[%1,%3]); *]
    ;

and_expression
    : boolean_expression                    [* %% = %1 ; *]
    | boolean_expression AND and_expression [* %% = mkComplexQuery('AND',[%1,%3]); *]
    ;

boolean_expression
    : NOT expression [* %% = mkNotQuery(%2); *]
    | expression     [* %% = %1; *]
    ;

expression
    : LEFT_PARENTHESE search_text RIGHT_PARENTHESE [* %% = %2; *]
40
    | COLUMN expression                            [* simpleQuerySetKey(%2,%1.split(':').slice(0,-1).join(':')); %% = %2; *]
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
    | value                                        [* %% = %1; *]
    ;

value
    : OPERATOR string [* %2.operator = %1 ; %% = %2; *]
    | string          [* %% = %1; *]
    ;

string
    : WORD   [* %% = mkSimpleQuery('',%1); *]
    | STRING [* %% = mkSimpleQuery('',%1.split('"').slice(1,-1).join('"')); *]
    ;

[*
var arrayExtend = function () {
56 57 58 59
  var j, i, newlist = [], list_list = arguments;
  for (j = 0; j < list_list.length; j += 1) {
    for (i = 0; i < list_list[j].length; i += 1) {
      newlist.push(list_list[j][i]);
60
    }
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
  }
  return newlist;

}, mkSimpleQuery = function (key, value, operator) {
  return {"type": "simple", "operator": "=", "key": key, "value": value};

}, mkNotQuery = function (query) {
  if (query.operator === "NOT") {
    return query.query_list[0];
  }
  return {"type": "complex", "operator": "NOT", "query_list": [query]};

}, mkComplexQuery = function (operator, query_list) {
  var i, query_list2 = [];
  for (i = 0; i < query_list.length; i += 1) {
    if (query_list[i].operator === operator) {
      query_list2 = arrayExtend(query_list2, query_list[i].query_list);
    } else {
      query_list2.push(query_list[i]);
80
    }
81 82 83 84 85 86 87 88
  }
  return {type:"complex",operator:operator,query_list:query_list2};

}, simpleQuerySetKey = function (query, key) {
  var i;
  if (query.type === "complex") {
    for (i = 0; i < query.query_list.length; ++i) {
      simpleQuerySetKey (query.query_list[i],key);
89
    }
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
    return true;
  }
  if (query.type === "simple" && !query.key) {
    query.key = key;
    return true;
  }
  return false;
},
  error_offsets = [],
  error_lookaheads = [],
  error_count = 0,
  result;

if ((error_count = __##PREFIX##parse(string, error_offsets, error_lookaheads)) > 0) {
  var i;
  for (i = 0; i < error_count; i += 1) {
    throw new Error("Parse error near \"" +
                    string.substr(error_offsets[i]) +
                    "\", expecting \"" +
                    error_lookaheads[i].join() + "\"");
  }
111 112
}
*]