]> Nishi Git Mirror - dataworks.git/commitdiff
fixed parser/lexer
authornishi <nishi@d4a5a174-5a4a-5b4b-b672-37683c10d7d5>
Wed, 5 Jun 2024 02:24:27 +0000 (02:24 +0000)
committernishi <nishi@d4a5a174-5a4a-5b4b-b672-37683c10d7d5>
Wed, 5 Jun 2024 02:24:27 +0000 (02:24 +0000)
git-svn-id: file:///raid/svn-main/nishi-dataworks/trunk@150 d4a5a174-5a4a-5b4b-b672-37683c10d7d5

Grammar/dw.l
Grammar/dw.y
Library/parser.c

index c1093580d5428417bdb0dea0590cf71a198e1703..d275087836ce054781890d6f0341806863ea67cb 100644 (file)
 #include "grammersym.h"
 #include <string.h>
 extern YYSTYPE yylval;
+
+double __dw_atof(const char* str);
 %}
 
 %%
 
-["][^"]*["]            {
+["][^"]*["]                    {
        yylval.node.string = strdup(yytext + 1);
        yylval.node.string[strlen(yylval.node.string) - 1] = 0;
        yylval.node.nodes = NULL;
        yylval.node.ident = NULL;
+       yylval.node.number = 123123;
+       yylval.node.type = 'S';
        return (STRING);
 }
-['][^']*[']            {
+['][^']*[']                    {
        yylval.node.string = strdup(yytext + 1);
        yylval.node.string[strlen(yylval.node.string) - 1] = 0;
        yylval.node.nodes = NULL;
        yylval.node.ident = NULL;
+       yylval.node.type = 'S';
        return (STRING);
 }
-[a-zA-Z0-9_\-]+                {
+[a-zA-Z_][a-zA-Z0-9_\-]*       {
        yylval.node.ident = strdup(yytext);
        yylval.node.nodes = NULL;
        yylval.node.string = NULL;
+       yylval.node.type = 'I';
        return (IDENTIFIER);
 }
-[\(\),]                        {
+-?[0-9]+(\.[0-9]+)?            {
+       yylval.node.ident = NULL;
+       yylval.node.nodes = NULL;
+       yylval.node.string = NULL;
+       yylval.node.number = __dw_atof(yytext);
+       yylval.node.type = 'N';
+       return (NUMBER);
+}
+[\(\),]                                {
        return (yytext[0]);
 }
 [ \t\v]*               {
index 3509483fc9e287d11c9e1ef033b15230d1efab48..58666381a3f35d75736cfc6e2bd5d6b2d73c63d0 100644 (file)
 #include <stdio.h>
 %}
 
-%token IDENTIFIER STRING SPACE
+%token IDENTIFIER STRING NUMBER SPACE
 %start command
 
 %union {
        struct Node {
                char* string;
                char* ident;
-               int errnum;
+                       int errnum;
+               char type;
+               double number;
                struct Node** nodes;
        } node;
 }
@@ -46,6 +48,7 @@
 %{
 void parser_process(struct Node* node);
 char* __dw_strdup(const char* a);
+double __dw_atof(const char* str);
 %}
 
 %%
@@ -55,6 +58,14 @@ argument
                $<node>$.string = $<node>1.string;
                $<node>$.nodes = $<node>1.nodes;
                $<node>$.ident = $<node>1.ident;
+               $<node>$.type = $<node>1.type;
+       }
+       | NUMBER {
+               $<node>$.string = $<node>1.string;
+               $<node>$.nodes = $<node>1.nodes;
+               $<node>$.ident = $<node>1.ident;
+               $<node>$.number = $<node>1.number;
+               $<node>$.type = $<node>1.type;
        }
        | command {
                $<node>$ = $<node>1;
@@ -63,16 +74,32 @@ argument
 
 single_argument
        : SPACE argument SPACE {
-               $<node>$ = $<node>2;
+               $<node>$.string = $<node>2.string;
+               $<node>$.nodes = $<node>2.nodes;
+               $<node>$.ident = $<node>2.ident;
+               $<node>$.number = $<node>2.number;
+               $<node>$.type = $<node>2.type;
        }
        | SPACE argument {
-               $<node>$ = $<node>2;
+               $<node>$.string = $<node>2.string;
+               $<node>$.nodes = $<node>2.nodes;
+               $<node>$.ident = $<node>2.ident;
+               $<node>$.number = $<node>2.number;
+               $<node>$.type = $<node>2.type;
        }
        | argument SPACE {
-               $<node>$ = $<node>1;
+               $<node>$.string = $<node>1.string;
+               $<node>$.nodes = $<node>1.nodes;
+               $<node>$.ident = $<node>1.ident;
+               $<node>$.number = $<node>1.number;
+               $<node>$.type = $<node>1.type;
        }
        | argument {
-               $<node>$ = $<node>1;
+               $<node>$.string = $<node>1.string;
+               $<node>$.nodes = $<node>1.nodes;
+               $<node>$.ident = $<node>1.ident;
+               $<node>$.number = $<node>1.number;
+               $<node>$.type = $<node>1.type;
        }
        ;
 
@@ -83,6 +110,8 @@ arguments
                $<node>$.nodes[0]->nodes = NULL;
                $<node>$.nodes[0]->ident = NULL;
                $<node>$.nodes[0]->string = NULL;
+               $<node>$.nodes[0]->number = $<node>1.number;
+               $<node>$.nodes[0]->type = $<node>1.type;
                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;
@@ -98,6 +127,8 @@ arguments
                $<node>$.nodes[i]->nodes = NULL;
                $<node>$.nodes[i]->ident = NULL;
                $<node>$.nodes[i]->string = NULL;
+               $<node>$.nodes[i]->number = $<node>3.number;
+               $<node>$.nodes[i]->type = $<node>3.type;
                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;
@@ -113,11 +144,13 @@ command
                $<node>$.string = NULL;
                $<node>$.ident = $<node>1.ident;
                $<node>$.nodes = $<node>4.nodes;
+               $<node>$.type = $<node>1.type;
        }
        | IDENTIFIER '(' arguments ')' {
                $<node>$.string = NULL;
                $<node>$.ident = $<node>1.ident;
                $<node>$.nodes = $<node>3.nodes;
+               $<node>$.type = $<node>1.type;
        }
        ;
 
index 70040253b8e343c5c34aae3f27984b0f626d97fb..7f5cade2da32767d94991c3671d541ebdde9d96a 100644 (file)
@@ -67,6 +67,8 @@ struct Node* __dw_duplicate_node(struct Node* node) {
        r->ident = NULL;
        r->string = NULL;
        r->nodes = NULL;
+       r->number = node->number;
+       r->type = node->type;
        if(node->ident != NULL) r->ident = __dw_strdup(node->ident);
        if(node->string != NULL) r->string = __dw_strdup(node->string);
        if(node->nodes != NULL) {
@@ -97,7 +99,11 @@ void __dw_free_node2(struct Node* node, bool top) {
 }
 
 void __dw_print_node(struct Node* node, bool top) {
-       if(node->string != NULL) {
+       if(node->type == 'N') {
+               printf("%f", node->number);
+               fflush(stdout);
+               if(top) printf("\n");
+       } else if(node->string != NULL) {
                printf("\"%s\"", node->string);
                fflush(stdout);
                if(top) printf("\n");