From 3f9aa332b05b012acaab6a7238a77d7ece4fc300 Mon Sep 17 00:00:00 2001 From: Runxi Yu Date: Wed, 17 Sep 2025 08:48:28 +0800 Subject: [PATCH] Fix some yacc bugs --- htmplgen/parse.y | 52 ++++++++++++++++++++++++---------------------------- diff --git a/htmplgen/parse.y b/htmplgen/parse.y index 5592fe76769ad0c1eb8faceea305a9abd15ef12b..6754fbe23ab4a6fd00c38ddf35cc15bf5e041cda 100644 --- a/htmplgen/parse.y +++ b/htmplgen/parse.y @@ -90,16 +90,16 @@ %token DEFINE ELSE END ERROR FINALLY FOR IF INCLUDE PRINTF %token RENDER TQFOREACH UNSAFE URLESCAPE WHILE %token STRING -%type string nstring +%type string %type stringy %% -grammar : /* empty */ +grammar : %empty | grammar include | grammar verbatim | grammar block - | grammar error { file->errors++; } + | grammar error { file->errors++; } ; include : INCLUDE STRING { @@ -124,7 +124,7 @@ } } ; -verbatim1 : /* empty */ +verbatim1 : %empty | verbatim1 STRING { if (*$2 != '\0') { dbg(); @@ -134,11 +134,7 @@ free($2); } ; -verbatims : /* empty */ - | verbatims verbatim - ; - -raw : nstring { +raw : STRING { dbg(); fprintf(fp, "htmpl::write(handle, "); printq($1); @@ -153,7 +149,7 @@ in_define = 0; } ; -define : '{' DEFINE string '}' { // TODO: Hare return +define : '{' DEFINE string '}' { /* TODO: Hare return */ in_define = 1; dbg(); @@ -162,7 +158,7 @@ free($3); } ; -body : /* empty */ +body : %empty | body verbatim | body raw | body special @@ -180,7 +176,21 @@ | '{' string '}' { dbg(); fprintf(fp, "htmpl::write_escape_html(handle, %s)?;\n", - $2); // TODO: quoting issues + $2); /* TODO: quoting issues */ + free($2); + } + | '{' string '|' UNSAFE '}' { + dbg(); + fprintf(fp, + "htmpl::write(handle, %s)?;\n", + $2); + free($2); + } + | '{' string '|' URLESCAPE '}' { + dbg(); + fprintf(fp, + "htmpl::write_escape_url(handle, %s)?;\n", + $2); free($2); } ; @@ -195,7 +205,7 @@ fputs("htmpl::write_escape_html(handle, _htmpl_tmp)?;\n", fp); } ; -printfargs : /* empty */ +printfargs : %empty | printfargs STRING { fprintf(fp, " %s", $2); free($2); @@ -253,15 +263,6 @@ end : '{' END '}' ; -nstring : STRING nstring { - if (asprintf(&$$, "%s%s", $1, $2) == -1) - err(1, "asprintf"); - free($1); - free($2); - } - | STRING - ; - string : STRING string { if (asprintf(&$$, "%s %s", $1, $2) == -1) err(1, "asprintf"); @@ -276,11 +277,6 @@ | STRING stringy { if (asprintf(&$$, "%s %s", $1, $2) == -1) err(1, "asprintf"); free($1); - free($2); - } - | '|' stringy { // TODO: what - if (asprintf(&$$, "|%s", $2) == -1) - err(1, "asprintf"); free($2); } ; @@ -693,7 +689,7 @@ // putc('\n', fp); // TODO: Removed for now because #line doesn't exist in Hare } -// Print a string in a form appropriate for raw inclusion into a Hare program. +/* Print a string in a form appropriate for raw inclusion into a Hare program. */ void printq(const char *str) { putc('"', fp); for (; *str; ++str) { -- 2.48.1