From 031bb53552b5b2675b1c3afb57a27b28cb5d379e Mon Sep 17 00:00:00 2001 From: Alessandro Iezzi Date: Wed, 24 Jul 2024 11:19:52 +0200 Subject: Add grammar rules to parse the value of a property In the lexer, I've done a string duplication, 'cause the value wasn't transfered to the parser. The VALUE token keep a single character, so, in the parser I need to concatenate every single character to a string. --- properties.l | 4 ++-- properties.y | 30 ++++++++++++++++++++++++++++-- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/properties.l b/properties.l index 67a5c2a..eb6ff81 100644 --- a/properties.l +++ b/properties.l @@ -5,8 +5,8 @@ %% =|: return DIV; -^[ \t]*[a-zA-Z0-9\.]* return KEY; +^[ \t]*[a-zA-Z0-9\.]* yylval.value = strdup(yytext); return KEY; [ \t]* ; -. return VALUE; +. yylval.value = strdup(yytext); return VALUE; %% diff --git a/properties.y b/properties.y index 69d683d..a765c8a 100644 --- a/properties.y +++ b/properties.y @@ -2,19 +2,45 @@ #include #include +#include %} %token KEY DIV VALUE +%union +{ + char *value; +} + %% -value: VALUE - | VALUE value +value: VALUE { + $$.value = calloc(2, sizeof(char)); + strcat($$.value, $1.value); + } + | value VALUE { + char *s = strdup($$.value); + $$.value = calloc(strlen(s) + strlen($2.value) + 1, sizeof(char)); + strcat($$.value, s); + strcat($$.value, $2.value); + } ; %% +extern FILE *yyin; + +int +main(void) +{ + do { + yyparse(); + } while(!feof(yyin)); + + return EXIT_SUCCESS; +} + void yyerror(char *s) { -- cgit v1.2.3