X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/41aca2e038810d45e67d0348f3ca91ac6e0f0ff3..75bbe78d87984e9c965b418f7a1bf20e0765f07d:/src/bison.s1 diff --git a/src/bison.s1 b/src/bison.s1 index f3cc2f6f..474e324f 100644 --- a/src/bison.s1 +++ b/src/bison.s1 @@ -309,10 +309,15 @@ yyparse(YYPARSE_PARAM_ARG) #endif - /* The variable used to return semantic values from the action - routines. */ + /* The variables used to return semantic value and location from the + action routines. */ YYSTYPE yyval; +# ifdef YYLSP_NEEDED + YYLTYPE yyloc; +# endif + /* When reducing, the number of symbols on the RHS of the reduced + rule. */ int yylen; if (yydebug) @@ -533,8 +538,27 @@ yydefault: /* Do a reduction. yyn is the number of a rule to reduce with. */ yyreduce: yylen = yyr2[yyn]; + /* Implement default value of the action: + `{dollar}{dollar} = {dollar}1'. */ + if (yylen > 0) + yyval = yyvsp[1-yylen]; +#ifdef YYLSP_NEEDED + /* Implement default location. If the rhs is empty, extend YYLOC to + YYLLOC, which corresponds to the current token, otherwise + implement `@{dollar} = Starts at @1, ends at @YYLEN'. */ if (yylen > 0) - yyval = yyvsp[1-yylen]; /* implement default value of the action */ + { + yyloc = yylsp[1-yylen]; + yyloc.last_line = yylsp[0].last_line; + yyloc.last_column = yylsp[0].last_column; + } + else + { + yyloc.last_line = yylsp[0].last_line; + yyloc.last_column = yylsp[0].last_column; + yyloc.text = 0; + } +#endif #if YYDEBUG /* We have to keep this `#if YYDEBUG', since we use variables which @@ -571,22 +595,8 @@ $ /* the action file gets copied in in place of this dollarsign */ } *++yyvsp = yyval; - #ifdef YYLSP_NEEDED - yylsp++; - if (yylen == 0) - { - yylsp->first_line = yylloc.first_line; - yylsp->first_column = yylloc.first_column; - yylsp->last_line = (yylsp-1)->last_line; - yylsp->last_column = (yylsp-1)->last_column; - yylsp->text = 0; - } - else - { - yylsp->last_line = (yylsp+yylen-1)->last_line; - yylsp->last_column = (yylsp+yylen-1)->last_column; - } + *++yylsp = yyloc; #endif /* Now `shift' the result of the reduction. Determine what state @@ -625,10 +635,14 @@ yyerrlab: /* here on detecting error */ x < (sizeof(yytname) / sizeof(char *)); x++) if (yycheck[x + yyn] == x) size += strlen(yytname[x]) + 15, count++; - msg = (char *) malloc(size + 15); + size += strlen ("parse error, unexpected `") + 1; + size += strlen (yytname[YYTRANSLATE (yychar)]); + msg = (char *) malloc (size); if (msg != 0) { - strcpy(msg, "parse error"); + strcpy (msg, "parse error, unexpected `"); + strcat (msg, yytname[YYTRANSLATE (yychar)]); + strcat (msg, "'"); if (count < 5) { @@ -637,21 +651,21 @@ yyerrlab: /* here on detecting error */ x < (sizeof(yytname) / sizeof(char *)); x++) if (yycheck[x + yyn] == x) { - strcat(msg, count == 0 ? ", expecting `" : " or `"); - strcat(msg, yytname[x]); - strcat(msg, "'"); + strcat (msg, count == 0 ? ", expecting `" : " or `"); + strcat (msg, yytname[x]); + strcat (msg, "'"); count++; } } - yyerror(msg); - free(msg); + yyerror (msg); + free (msg); } else yyerror ("parse error; also virtual memory exceeded"); } else #endif /* YYERROR_VERBOSE */ - yyerror("parse error"); + yyerror ("parse error"); } goto yyerrlab1;