fixed logical expression parser

Thu, 28 May 2015 13:48:39 +0200

author
Mike Becker <universe@uap-core.de>
date
Thu, 28 May 2015 13:48:39 +0200
changeset 116
44ffe073b5e3
parent 115
5744a3dee766
child 117
5ffc2f23803f

fixed logical expression parser

libidav/davqlparser.c file | annotate | diff | comparison | revisions
libidav/davqlparser.h file | annotate | diff | comparison | revisions
--- a/libidav/davqlparser.c	Thu May 28 12:22:55 2015 +0200
+++ b/libidav/davqlparser.c	Thu May 28 13:48:39 2015 +0200
@@ -459,10 +459,6 @@
         case '(': token->tokenclass = DAVQL_TOKEN_OPENP; break;
         case ')': token->tokenclass = DAVQL_TOKEN_CLOSEP; break;
         case ',': token->tokenclass = DAVQL_TOKEN_COMMA; break;
-        case '=': token->tokenclass = DAVQL_TOKEN_EQ; break;
-        case '<': token->tokenclass = DAVQL_TOKEN_LT; break;
-        case '>': token->tokenclass = DAVQL_TOKEN_GT; break;
-        case '!': token->tokenclass = DAVQL_TOKEN_EXCLAIM; break;
         default:
             token->tokenclass = strchr(special_token_symbols, firstchar) ?
                 DAVQL_TOKEN_OPERATOR : DAVQL_TOKEN_IDENTIFIER;
@@ -1104,7 +1100,9 @@
             }
         }
 
-        int consumed = dav_parse_expression(stmt, token, expr->right);
+        DavQLExpression rexpr;
+        memset(&rexpr, 0, sizeof(DavQLExpression));
+        int consumed = dav_parse_expression(stmt, token, &rexpr);
         if (stmt->errorcode) {
             return 0;
         }
@@ -1118,6 +1116,8 @@
         total_consumed += consumed;
         expr->left = malloc(sizeof(DavQLExpression));
         memcpy(expr->left, &bexpr, sizeof(DavQLExpression));
+        expr->right = malloc(sizeof(DavQLExpression));
+        memcpy(expr->right, &rexpr, sizeof(DavQLExpression));
 
         return total_consumed;
     }
@@ -1136,13 +1136,13 @@
     
     // RULE:    "not ", LogicalExpression
     if (token_is(token, DAVQL_TOKEN_OPERATOR) && tokenvalue_is(token, "not")) {
-        token = token->next;
         expr->type = DAVQL_LOGICAL;
         expr->op = DAVQL_NOT;
         expr->left = calloc(1, sizeof(DavQLExpression));
         expr->srctext = token_sstr(token);
-        
-        int consumed = dav_parse_logical_expr(stmt, token, expr->left);
+
+        token = token->next;
+        int consumed = dav_parse_bool_expr(stmt, token, expr->left);
         if (stmt->errorcode) {
             return 0;
         }
@@ -1182,7 +1182,7 @@
             return 0;
         }
     }
-    // RULE:    BooleanExpression
+    // RULE:    BooleanPrimary
     else {
         return dav_parse_bool_prim(stmt, token, expr);
     }
@@ -1276,7 +1276,7 @@
     // RULE:    "depth", "=", (Number | "infinity")
     if (tokenvalue_is(token, "depth")) {
         token = token->next; total_consumed++;
-        if (token_is(token, DAVQL_TOKEN_EQ)) {
+        if (tokenvalue_is(token, "=")) {
             token = token->next; total_consumed++;
             if (tokenvalue_is(token, "infinity")) {
                 stmt->depth = DAV_DEPTH_INFINITY;
@@ -1319,19 +1319,13 @@
 }
 
 static int dav_parse_orderby_clause(DavQLStatement *stmt, UcxList *token) {
+    
+    // RULE:    OrderByCriterion, {",", OrderByCriterion};
+    // OrderByCriterion = (Identifier | Number), [" asc"|" desc"];
     return 0;
 }
 
 /**
- * Semantic analysis of a get statement.
- * @param stmt the statement to analyze.
- */
-static void dav_analyze_get_statement(DavQLStatement *stmt) {
-    // TODO: make it so
-}
-
-
-/**
  * Parser of a get statement.
  * @param stmt the statement object that shall contain the syntax tree
  * @param tokens the token list
@@ -1428,8 +1422,6 @@
             dav_error_in_context(DAVQL_ERROR_UNEXPECTED_TOKEN,
                 _error_unexpected_token, stmt, tokens);
         }
-    } else {
-        dav_analyze_get_statement(stmt);
     }
 }
 
--- a/libidav/davqlparser.h	Thu May 28 12:22:55 2015 +0200
+++ b/libidav/davqlparser.h	Thu May 28 13:48:39 2015 +0200
@@ -50,7 +50,6 @@
     DAVQL_TOKEN_IDENTIFIER, DAVQL_TOKEN_FMTSPEC,
     DAVQL_TOKEN_STRING, DAVQL_TOKEN_NUMBER, DAVQL_TOKEN_TIMESTAMP,
     DAVQL_TOKEN_COMMA, DAVQL_TOKEN_OPENP, DAVQL_TOKEN_CLOSEP,
-    DAVQL_TOKEN_EQ, DAVQL_TOKEN_LT, DAVQL_TOKEN_GT, DAVQL_TOKEN_EXCLAIM,
     DAVQL_TOKEN_OPERATOR
 } davqltokenclass_t;
 
@@ -181,8 +180,8 @@
  * String          = "'", {?Character? - "'" | "'''"} , "'" | "%s";
  * Timestamp       = "%t"; // TODO: maybe introduce a real literal 
  * 
- * LogicalExpression = BooleanLiteral, [LogicalOperator, LogicalExpression];
- * BooleanExpression = "not ", LogicalExpression
+ * LogicalExpression = BooleanExpression, [LogicalOperator, LogicalExpression];
+ * BooleanExpression = "not ", BooleanExpression
  *                   | "(", LogicalExpression, ")"
  *                   | BooleanPrimary;
  * BooleanPrimary    = Expression, (" like " | " unlike "), String

mercurial