A somewhat stricter grammar. Put everything in a linked list, and
generate files after parsing (so there won't be any half written files). git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@4429 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
@@ -42,6 +42,8 @@ RCSID("$Id$");
|
|||||||
|
|
||||||
void yyerror (char *s);
|
void yyerror (char *s);
|
||||||
long name2number(const char *str);
|
long name2number(const char *str);
|
||||||
|
|
||||||
|
extern char *yytext;
|
||||||
%}
|
%}
|
||||||
|
|
||||||
%union {
|
%union {
|
||||||
@@ -56,20 +58,25 @@ long name2number(const char *str);
|
|||||||
%%
|
%%
|
||||||
|
|
||||||
file : /* */
|
file : /* */
|
||||||
| statements
|
| header statements end
|
||||||
;
|
;
|
||||||
|
|
||||||
statements : statement
|
header : id et
|
||||||
| statements statement
|
| et
|
||||||
;
|
;
|
||||||
|
|
||||||
statement : ET STRING
|
id : ID STRING
|
||||||
|
{
|
||||||
|
id_str = $2;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
|
et : ET STRING
|
||||||
{
|
{
|
||||||
base = name2number($2);
|
base = name2number($2);
|
||||||
strncpy(name, $2, sizeof(name));
|
strncpy(name, $2, sizeof(name));
|
||||||
name[sizeof(name) - 1] = '\0';
|
name[sizeof(name) - 1] = '\0';
|
||||||
free($2);
|
free($2);
|
||||||
prologue();
|
|
||||||
}
|
}
|
||||||
| ET STRING STRING
|
| ET STRING STRING
|
||||||
{
|
{
|
||||||
@@ -78,18 +85,16 @@ statement : ET STRING
|
|||||||
name[sizeof(name) - 1] = '\0';
|
name[sizeof(name) - 1] = '\0';
|
||||||
free($2);
|
free($2);
|
||||||
free($3);
|
free($3);
|
||||||
prologue();
|
|
||||||
}
|
}
|
||||||
| INDEX NUMBER
|
;
|
||||||
|
|
||||||
|
statements : statement
|
||||||
|
| statements statement
|
||||||
|
;
|
||||||
|
|
||||||
|
statement : INDEX NUMBER
|
||||||
{
|
{
|
||||||
for(; number < $2; number++) {
|
number = $2;
|
||||||
/*
|
|
||||||
fprintf(h_file, "\t%s_ERROR_%d = %d,\n",
|
|
||||||
name, number, base + number);
|
|
||||||
*/
|
|
||||||
fprintf(c_file, "\t/* %03d */ \"Reserved %s error (%d)\",\n",
|
|
||||||
number, name, number);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
| PREFIX STRING
|
| PREFIX STRING
|
||||||
{
|
{
|
||||||
@@ -105,18 +110,21 @@ statement : ET STRING
|
|||||||
}
|
}
|
||||||
| EC STRING ',' STRING
|
| EC STRING ',' STRING
|
||||||
{
|
{
|
||||||
fprintf(h_file, "\t%s%s = %d,\n",
|
struct error_code *ec = malloc(sizeof(*ec));
|
||||||
prefix ? prefix : "", $2, number + base);
|
ec->number = number;
|
||||||
fprintf(c_file, "\t/* %03d */ \"%s\",\n", number, $4);
|
if(prefix && *prefix != '\0') {
|
||||||
free($2);
|
ec->name = malloc(strlen(prefix) + strlen($2) + 1);
|
||||||
free($4);
|
strcpy(ec->name, prefix);
|
||||||
|
strcat(ec->name, $2);
|
||||||
|
free($2);
|
||||||
|
} else
|
||||||
|
ec->name = $2;
|
||||||
|
ec->string = $4;
|
||||||
|
APPEND(codes, ec);
|
||||||
number++;
|
number++;
|
||||||
}
|
}
|
||||||
| ID STRING
|
;
|
||||||
{
|
end : END
|
||||||
id_str = $2;
|
|
||||||
}
|
|
||||||
| END
|
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user