]> Nishi Git Mirror - dataworks.git/commitdiff
bison sucks, byacc supremacy
authornishi <nishi@d4a5a174-5a4a-5b4b-b672-37683c10d7d5>
Tue, 4 Jun 2024 12:02:08 +0000 (12:02 +0000)
committernishi <nishi@d4a5a174-5a4a-5b4b-b672-37683c10d7d5>
Tue, 4 Jun 2024 12:02:08 +0000 (12:02 +0000)
git-svn-id: file:///raid/svn-main/nishi-dataworks/trunk@147 d4a5a174-5a4a-5b4b-b672-37683c10d7d5

Grammar/dw.y
Library/dw_parser.h
Library/exec.c
Library/parser.c
common-decl.mk

index 8026ad4a7183f2072a5977e39ece9d1561aa30c3..1222225e874b072d1806c850b0f5d52d15db1784 100644 (file)
@@ -44,6 +44,7 @@
 
 %{
 void parser_process(struct Node* node);
+char* __dw_strdup(const char* a);
 %}
 
 %%
@@ -81,8 +82,8 @@ arguments
                $<node>$.nodes[0]->nodes = NULL;
                $<node>$.nodes[0]->ident = NULL;
                $<node>$.nodes[0]->string = NULL;
-               if($<node>1.ident != NULL) $<node>$.nodes[0]->ident = strdup($<node>1.ident);
-               if($<node>1.string != NULL) $<node>$.nodes[0]->string = strdup($<node>1.string);
+               if($<node>1.ident != NULL) $<node>$.nodes[0]->ident = __dw_strdup($<node>1.ident);
+               if($<node>1.string != NULL) $<node>$.nodes[0]->string = __dw_strdup($<node>1.string);
                if($<node>1.nodes != NULL) $<node>$.nodes[0]->nodes = $<node>1.nodes;
                $<node>$.nodes[1] = NULL;
        }
@@ -96,8 +97,8 @@ arguments
                $<node>$.nodes[i]->nodes = NULL;
                $<node>$.nodes[i]->ident = NULL;
                $<node>$.nodes[i]->string = NULL;
-               if($<node>3.ident != NULL) $<node>$.nodes[i]->ident = strdup($<node>3.ident);
-               if($<node>3.string != NULL) $<node>$.nodes[i]->string = strdup($<node>3.string);
+               if($<node>3.ident != NULL) $<node>$.nodes[i]->ident = __dw_strdup($<node>3.ident);
+               if($<node>3.string != NULL) $<node>$.nodes[i]->string = __dw_strdup($<node>3.string);
                if($<node>3.nodes != NULL) $<node>$.nodes[i]->nodes = $<node>3.nodes;
                $<node>$.nodes[i + 1] = NULL;
                free(old_nodes);        
@@ -123,6 +124,7 @@ command
 
 #if defined(YYBISON)
 const char* yaccver = "GNU Bison " YYBISON_VERSION;
+#error "GNU Bison does not work. Use Berkeley Yacc."
 #elif defined(YYBYACC)
 #define XSTR(x) #x
 #define STR(x) XSTR(x)
index 0cf57d2c59ca388043722578ba9371d2e2ebfd8c..7bdd7a75529be8ace3a3f7c02acfbf9b303861a9 100644 (file)
@@ -42,7 +42,9 @@ extern "C" {
 
 #include <stdbool.h>
 
-int __dw_parser_parse(const char* str, bool top);
+#include "../Grammar/dw.tab.h"
+
+struct Node* __dw_parser_parse(const char* str, bool top);
 
 #ifdef __cplusplus
 }
index 2b49b09b15037e92c31d654679d634375189ab8e..46a59ea2b522204f9896ed855a25a0da01dfd755 100644 (file)
@@ -40,10 +40,10 @@ struct dataworks_db_result* dataworks_database_execute_code(struct dataworks_db*
        r->error = false;
        r->value = NULL;
 
-       int err;
-       if((err = __dw_parser_parse(code, dolog)) != DW_ERR_SUCCESS) {
+       struct Node* node;
+       if((node = __dw_parser_parse(code, dolog)) == NULL) {
                r->error = true;
-               r->errnum = err;
+               r->errnum = DW_ERR_PARSER_FAIL;
        }
 
        return r;
index cba1b290c330ea2210805bef4386364095fda074..31160f1310bdb3bfd4cb2fe6512e774c8626cbb4 100644 (file)
@@ -67,7 +67,8 @@ void parser_process(struct Node* node) {
        }
 }
 
-int __dw_parser_parse(const char* str, bool top) {
+struct Node* __dw_parser_parse(const char* str, bool top) {
+       extern YYSTYPE yyval;
 #ifdef PARSER_DEBUG
        yydebug = 1;
 #endif
@@ -75,12 +76,10 @@ int __dw_parser_parse(const char* str, bool top) {
        void* buf = yy_scan_string(str);
        if(yyparse() != 0) {
                yy_delete_buffer(buf);
-               return DW_ERR_PARSER_FAIL;
-       } else {
-               extern YYSTYPE yyval;
-               parser_process(&yyval.node);
+               return NULL;
        }
+       parser_process(&yyval.node);
        yy_delete_buffer(buf);
 
-       return DW_ERR_SUCCESS;
+       return &yyval.node;
 }
index 73166ebd9be58c01d8292def7f62a911ebd7f67e..23e9eef05bcbca3cf596948e9313ba22b4b29701 100644 (file)
@@ -10,7 +10,7 @@ RANLIB = ranlib
 WINDRES = windres
 CFLAGS = -g -std=c99 -D_DEFAULT_SOURCE $(DEBUGFLAGS)
 LDFLAGS = -L`pwd`/Library
-YFLAGS = -d -t
+YFLAGS = -d -t -y
 LFLAGS =
 LIBS =
 LIB_PREFIX = lib