]> Nishi Git Mirror - dataworks.git/commitdiff
fix yacc
authornishi <nishi@d4a5a174-5a4a-5b4b-b672-37683c10d7d5>
Tue, 4 Jun 2024 03:16:37 +0000 (03:16 +0000)
committernishi <nishi@d4a5a174-5a4a-5b4b-b672-37683c10d7d5>
Tue, 4 Jun 2024 03:16:37 +0000 (03:16 +0000)
git-svn-id: file:///raid/svn-main/nishi-dataworks/trunk@141 d4a5a174-5a4a-5b4b-b672-37683c10d7d5

Grammar/dw.y
Library/database.c
Library/dataworks.c
Library/dw_database.h
Library/exec.c
Library/parser.c

index 2f1a5057c62702d1563eede3da7c5db95c15f7c3..7f48ad5dd52e9b534e2da12105d0c72691eebcd6 100644 (file)
@@ -59,6 +59,8 @@ single_argument
 arguments
        : single_argument
        | arguments ',' single_argument
+       | SPACE
+       | ;
        ;
 
 command
index 5f77c7e52391bc161808448c0911f5204e3495b7..b0770a4f0607fbe02c39d89b1ef6a6622551b7e1 100644 (file)
@@ -38,7 +38,7 @@
 
 const char sig[3] = {0x7f, 'D', 'W'};
 
-const char* dw_errors[] = {"Success", "Used already", "File open fail", "Invalid signature", "Invalid version", "Parser returned NULL", "Cannot call non-method", "Unknown method", "Insufficient arguments", "Too many arguments", "Not used", "Too many tables", "Database not selected"};
+const char* dw_errors[] = {"Success", "Used already", "File open fail", "Invalid signature", "Invalid version", "Parser returned NULL", "Cannot call non-method", "Unknown method", "Insufficient arguments", "Too many arguments", "Not used", "Too many tables", "Database not selected", "Parser fail"};
 
 #ifdef M_I86
 #define BUFSIZE 128
index 4058122395a6ca9c1f872ace216b7e343fe6632d..dd6e7a0cc1cc030980332fe353be3b51bd2f4b7e 100644 (file)
@@ -29,6 +29,7 @@
 #include "dataworks.h"
 
 #include <stdbool.h>
+#include <stdio.h>
 
 const char* dataworks_version = "0.0.0";
 const char* dataworks_compile_date = __DATE__;
@@ -70,7 +71,7 @@ const char* dataworks_get_copyright(void) { return dataworks_copyright; }
 
 int yywrap() { return 1; }
 
-int yyerror(const char* err) { return 0; }
+int yyerror(const char* err) { fprintf(stderr, "Parser error: %s\n", err); return 0; }
 
 bool dataworks_get_if_supported(void) {
 #ifdef SUPPORTED
index 52c8b2ecf71d32410e5b7a47e9d4110abede4cba..906436bf799d071f6a83b4bdfa7660f09a5edb29 100644 (file)
@@ -163,6 +163,13 @@ enum DW_ERRORS {
         *
         */
        DW_ERR_DATABASE_NOT_SELECTED,
+
+       /**
+        * @~english
+        * @brief Parser fail
+        *
+        */
+       DW_ERR_PARSER_FAIL,
 };
 
 /**
index 4509696ae760fc0bf06d01280616df75eed6e29a..deb1e51dd4911347ff273962ae687797a23b14d9 100644 (file)
@@ -40,7 +40,11 @@ struct dataworks_db_result* dataworks_database_execute_code(struct dataworks_db*
        r->error = false;
        r->value = NULL;        
 
-       __dw_parser_parse(code, dolog);
+       int err;
+       if((err = __dw_parser_parse(code, dolog)) != DW_ERR_SUCCESS){
+               r->error = true;
+               r->errnum = err;
+       }
 
        return r;
 }
index 866dceab17bf33d2fdb51d57c7ec1987ac2aaffc..20d7701e176e1320b3a13ad14defdcc1b3ff0738 100644 (file)
@@ -43,6 +43,11 @@ extern void yy_delete_buffer(void* buffer);
 
 int __dw_parser_parse(const char* str, bool top) {
        void* buf = yy_scan_string(str);
-       yyparse();
+       if(yyparse() != 0){
+               yy_delete_buffer(buf);
+               return DW_ERR_PARSER_FAIL;
+       }
        yy_delete_buffer(buf);
+
+       return DW_ERR_SUCCESS;
 }