tReduce the differences between yaccpar and yaccpars. Add support for passing an argument through yyparse to yylex. - plan9port - [fork] Plan 9 from user space
git clone git://src.adamsgaard.dk/plan9port
Log
Files
Refs
README
LICENSE
---
commit cae9bfe9da0a9d46554940c127fb2a022f1360f6
parent 5ddc97fc3e63fb0bdf14ec3583afbec765f1a45d
Author: wkj 
Date:   Mon, 14 Feb 2005 20:27:13 +0000

Reduce the differences between yaccpar and yaccpars.
Add support for passing an argument through yyparse to yylex.

Diffstat:
  M lib/yaccpar                         |      54 +++++++++++++++++++++++++------
  M lib/yaccpars                        |      50 +++++++++++++++++++++++++-------
  M man/man1/yacc.1                     |       9 +++++++++
  M src/cmd/yacc.c                      |      71 +++++++++++++++++++++++--------

4 files changed, 146 insertions(+), 38 deletions(-)
---
diff --git a/lib/yaccpar b/lib/yaccpar
t@@ -1,4 +1,7 @@
 #define YYFLAG                 -1000
+#define YYERROR                goto yyerrlab
+#define YYACCEPT        return(0)
+#define YYABORT                return(1)
 #define        yyclearin        yychar = -1
 #define        yyerrok                yyerrflag = 0
 
t@@ -6,19 +9,25 @@
 #include        "y.debug"
 #else
 #define        yydebug                0
-char*        yytoknames[1];                /* for debugging */
-char*        yystates[1];                /* for debugging */
+static        const        char*        yytoknames[1];                /* for debugging */
+static        const        char*        yystates[1];                /* for debugging */
 #endif
 
 /*        parser for yacc output        */
-
+#ifdef YYARG
+#define        yynerrs                yyarg->yynerrs
+#define        yyerrflag        yyarg->yyerrflag
+#define yyval                yyarg->yyval
+#define yylval                yyarg->yylval
+#else
 int        yynerrs = 0;                /* number of errors */
 int        yyerrflag = 0;                /* error recovery flag */
+#endif
 
 extern        int        fprint(int, char*, ...);
 extern        int        sprint(char*, char*, ...);
 
-char*
+static const char*
 yytokname(int yyc)
 {
         static char x[10];
t@@ -30,7 +39,7 @@ yytokname(int yyc)
         return x;
 }
 
-char*
+static const char*
 yystatname(int yys)
 {
         static char x[10];
t@@ -42,14 +51,22 @@ yystatname(int yys)
         return x;
 }
 
-long
+static long
+#ifdef YYARG
+yylex1(struct Yyarg *yyarg)
+#else
 yylex1(void)
+#endif
 {
         long yychar;
-        long *t3p;
+        const long *t3p;
         int c;
 
+#ifdef YYARG        
+        yychar = yylex(yyarg);
+#else
         yychar = yylex();
+#endif
         if(yychar <= 0) {
                 c = yytok1[0];
                 goto out;
t@@ -83,16 +100,21 @@ out:
 }
 
 int
+#ifdef YYARG
+yyparse(struct Yyarg *yyarg)
+#else
 yyparse(void)
+#endif
 {
         struct
         {
                 YYSTYPE        yyv;
                 int        yys;
         } yys[YYMAXDEPTH], *yyp, *yypt;
-        short *yyxi;
+        const short *yyxi;
         int yyj, yym, yystate, yyn, yyg;
         long yychar;
+#ifndef YYARG
         YYSTYPE save1, save2;
         int save3, save4;
 
t@@ -100,6 +122,7 @@ yyparse(void)
         save2 = yyval;
         save3 = yynerrs;
         save4 = yyerrflag;
+#endif
 
         yystate = 0;
         yychar = -1;
t@@ -117,10 +140,12 @@ ret1:
         goto ret;
 
 ret:
+#ifndef YYARG
         yylval = save1;
         yyval = save2;
         yynerrs = save3;
         yyerrflag = save4;
+#endif
         return yyn;
 
 yystack:
t@@ -141,7 +166,11 @@ yynewstate:
         if(yyn <= YYFLAG)
                 goto yydefault; /* simple state */
         if(yychar < 0)
+#ifdef YYARG
+                yychar = yylex1(yyarg);
+#else
                 yychar = yylex1();
+#endif
         yyn += yychar;
         if(yyn < 0 || yyn >= YYLAST)
                 goto yydefault;
t@@ -160,7 +189,11 @@ yydefault:
         yyn = yydef[yystate];
         if(yyn == -2) {
                 if(yychar < 0)
-                        yychar = yylex1();
+#ifdef YYARG
+                yychar = yylex1(yyarg);
+#else
+                yychar = yylex1();
+#endif
 
                 /* look through exception table */
                 for(yyxi=yyexca;; yyxi+=2)
t@@ -180,11 +213,12 @@ yydefault:
                 switch(yyerrflag) {
                 case 0:   /* brand new error */
                         yyerror("syntax error");
-                        yynerrs++;
                         if(yydebug >= 1) {
                                 fprint(2, "%s", yystatname(yystate));
                                 fprint(2, "saw %s\n", yytokname(yychar));
                         }
+yyerrlab:
+                        yynerrs++;
 
                 case 1:
                 case 2: /* incompletely recovered error ... try again */
diff --git a/lib/yaccpars b/lib/yaccpars
t@@ -9,16 +9,22 @@
 #include        "y.debug"
 #else
 #define        yydebug                0
-char*        yytoknames[1];                /* for debugging */
-char*        yystates[1];                /* for debugging */
+static        const        char*        yytoknames[1];                /* for debugging */
+static        const        char*        yystates[1];                /* for debugging */
 #endif
 
 /*        parser for yacc output        */
-
+#ifdef YYARG
+#define        yynerrs                yyarg->yynerrs
+#define        yyerrflag        yyarg->yyerrflag
+#define yyval                yyarg->yyval
+#define yylval                yyarg->yylval
+#else
 int        yynerrs = 0;                /* number of errors */
 int        yyerrflag = 0;                /* error recovery flag */
+#endif
 
-char*
+static const char*
 yytokname(int yyc)
 {
         static char x[10];
t@@ -30,7 +36,7 @@ yytokname(int yyc)
         return x;
 }
 
-char*
+static const char*
 yystatname(int yys)
 {
         static char x[10];
t@@ -42,14 +48,22 @@ yystatname(int yys)
         return x;
 }
 
-long
+static long
+#ifdef YYARG
+yylex1(struct Yyarg *yyarg)
+#else
 yylex1(void)
+#endif
 {
         long yychar;
-        long *t3p;
+        const long *t3p;
         int c;
 
+#ifdef YYARG        
+        yychar = yylex(yyarg);
+#else
         yychar = yylex();
+#endif
         if(yychar <= 0) {
                 c = yytok1[0];
                 goto out;
t@@ -83,23 +97,29 @@ out:
 }
 
 int
+#ifdef YYARG
+yyparse(struct Yyarg *yyarg)
+#else
 yyparse(void)
+#endif
 {
         struct
         {
                 YYSTYPE        yyv;
                 int        yys;
         } yys[YYMAXDEPTH], *yyp, *yypt;
-        short *yyxi;
+        const short *yyxi;
         int yyj, yym, yystate, yyn, yyg;
+        long yychar;
+#ifndef YYARG
         YYSTYPE save1, save2;
         int save3, save4;
-        long yychar;
 
         save1 = yylval;
         save2 = yyval;
         save3 = yynerrs;
         save4 = yyerrflag;
+#endif
 
         yystate = 0;
         yychar = -1;
t@@ -117,10 +137,12 @@ ret1:
         goto ret;
 
 ret:
+#ifndef YYARG
         yylval = save1;
         yyval = save2;
         yynerrs = save3;
         yyerrflag = save4;
+#endif
         return yyn;
 
 yystack:
t@@ -141,7 +163,11 @@ yynewstate:
         if(yyn <= YYFLAG)
                 goto yydefault; /* simple state */
         if(yychar < 0)
+#ifdef YYARG
+                yychar = yylex1(yyarg);
+#else
                 yychar = yylex1();
+#endif
         yyn += yychar;
         if(yyn < 0 || yyn >= YYLAST)
                 goto yydefault;
t@@ -160,7 +186,11 @@ yydefault:
         yyn = yydef[yystate];
         if(yyn == -2) {
                 if(yychar < 0)
-                        yychar = yylex1();
+#ifdef YYARG
+                yychar = yylex1(yyarg);
+#else
+                yychar = yylex1();
+#endif
 
                 /* look through exception table */
                 for(yyxi=yyexca;; yyxi+=2)
diff --git a/man/man1/yacc.1 b/man/man1/yacc.1
t@@ -86,6 +86,15 @@ Stdio
 instead of the
 .B print
 routines in libc.
+.TP
+.BI -l
+Disable #line directives in the generated parser.
+.TP
+.BI -a
+Generate a parser that takes an argument of type Yyarg
+and passes this argument to each invocation of the lexer
+function, yylex.  Yyarg contains per-instance state
+and a single user-visible member, arg, of type void*.
 .PP
 The specification of
 .I yacc
diff --git a/src/cmd/yacc.c b/src/cmd/yacc.c
t@@ -15,6 +15,7 @@
 
 char *PARSER = "#9/lib/yaccpar";
 char *PARSERS = "#9/lib/yaccpars";
+
 #define TEMPNAME        "y.tmp.XXXXXX"
 #define ACTNAME                "y.acts.XXXXXX"
 #define OFILE                "tab.c"
t@@ -185,6 +186,8 @@ char        ttempname[] = TEMPNAME;
 char        tactname[] = ACTNAME;
 char*        parser;
 char*        yydebug;
+int        yyarg;
+int        yyline = 1;
 
         /* storage of types */
 int        ntypes;                        /* number of types defined */
t@@ -459,7 +462,7 @@ others(void)
         warray("yytok2", temp1, c+1);
 
         /* table 3 has everything else */
-        Bprint(ftable, "long        yytok3[] =\n{\n");
+        Bprint(ftable, "static\tconst\tlong        yytok3[] =\n{\n");
         c = 0;
         TLOOP(i) {
                 j = tokset[i].value;
t@@ -1176,6 +1179,7 @@ setup(int argc, char *argv[])
         int i, j, fd, lev, ty, ytab, *p;
         int vflag, dflag, stem;
         char actnm[8], *stemc, *s, dirbuf[128];
+        Biobuf *fout;
 
         ytab = 0;
         vflag = 0;
t@@ -1193,9 +1197,15 @@ setup(int argc, char *argv[])
         case 'D':
                 yydebug = ARGF();
                 break;
+        case 'a':
+                yyarg = 1;
+                break;
         case 'd':
                 dflag++;
                 break;
+        case 'l':
+                yyline = 0;
+                break;
         case 'o':
                 ytab++;
                 ytabc = ARGF();
t@@ -1211,7 +1221,10 @@ setup(int argc, char *argv[])
                 error("illegal option: %c", ARGC());
         }ARGEND
         openup(stemc, dflag, vflag, ytab, ytabc);
-
+        fout = dflag?fdefine:ftable;
+        if(yyarg){
+                Bprint(fdefine, "#define\tYYARG\t1\n\n");
+        }
         if((fd = mkstemp(ttempname)) >= 0){
                 tempname = ttempname;
                 ftemp = Bfdopen(fd, OWRITE);
t@@ -1369,7 +1382,8 @@ setup(int argc, char *argv[])
                 error("unexpected EOF before %%");
 
         /* t is MARK */
-        Bprint(ftable, "extern        int        yyerrflag;\n");
+        if(!yyarg)
+                Bprint(ftable, "extern        int        yyerrflag;\n");
         Bprint(ftable, "#ifndef        YYMAXDEPTH\n");
         Bprint(ftable, "#define        YYMAXDEPTH        150\n");
         Bprint(ftable, "#endif\n" );
t@@ -1378,9 +1392,20 @@ setup(int argc, char *argv[])
                 Bprint(ftable, "#define        YYSTYPE        int\n");
                 Bprint(ftable, "#endif\n");
         }
-        Bprint(ftable, "YYSTYPE        yylval;\n");
-        Bprint(ftable, "YYSTYPE        yyval;\n");
-
+        if(!yyarg){
+                Bprint(ftable, "YYSTYPE        yylval;\n");
+                Bprint(ftable, "YYSTYPE        yyval;\n");
+        }else{
+                if(dflag)
+                        Bprint(ftable, "#include \"%s.%s\"\n\n", stemc, FILED);
+                Bprint(fout, "struct Yyarg {\n");
+                Bprint(fout, "\tint\tyynerrs;\n");
+                Bprint(fout, "\tint\tyyerrflag;\n");
+                Bprint(fout, "\tvoid*\targ;\n");
+                Bprint(fout, "\tYYSTYPE\tyyval;\n");
+                Bprint(fout, "\tYYSTYPE\tyylval;\n");
+                Bprint(fout, "};\n\n");
+        }
         prdptr[0] = mem;
 
         /* added production */
t@@ -1508,7 +1533,9 @@ setup(int argc, char *argv[])
 
         finact();
         if(t == MARK) {
-                Bprint(ftable, "\n#line\t%d\t\"%s\"\n", lineno, infile);
+                Bprint(ftable, "\n");
+                if(yyline)
+                        Bprint(ftable, "#line\t%d\t\"%s\"\n", lineno, infile);
                 while((c=Bgetrune(finput)) != Beof)
                         Bputrune(ftable, c);
         }
t@@ -1625,7 +1652,7 @@ defout(int last)
         }
         ndefout = ntokens+1;
         if(last && fdebug) {
-                Bprint(fdebug, "char*        yytoknames[] =\n{\n");
+                Bprint(fdebug, "static        char*        yytoknames[] =\n{\n");
                 TLOOP(i) {
                         if(tokset[i].name) {
                                 chcopy(sar, tokset[i].name);
t@@ -1844,7 +1871,9 @@ cpyunion(void)
         long c;
         int level;
 
-        Bprint(ftable, "\n#line\t%d\t\"%s\"\n", lineno, infile);
+        Bprint(ftable, "\n");
+        if(yyline)
+                Bprint(ftable, "#line\t%d\t\"%s\"\n", lineno, infile);
         Bprint(ftable, "typedef union ");
         if(fdefine != 0)
                 Bprint(fdefine, "\ntypedef union ");
t@@ -1869,8 +1898,11 @@ cpyunion(void)
                         /* we are finished copying */
                         if(level == 0) {
                                 Bprint(ftable, " YYSTYPE;\n");
-                                if(fdefine != 0)
-                                        Bprint(fdefine, "\tYYSTYPE;\nextern\tYYSTYPE\tyylval;\n");
+                                if(fdefine != 0){
+                                        Bprint(fdefine, "\tYYSTYPE;\n");
+                                        if(!yyarg)
+                                                Bprint(fdefine, "extern\tYYSTYPE\tyylval;\n");
+                                }
                                 return;
                         }
                 }
t@@ -1883,7 +1915,6 @@ cpyunion(void)
 void
 cpycode(void)
 {
-
         long c;
 
         c = Bgetrune(finput);
t@@ -1891,7 +1922,9 @@ cpycode(void)
                 c = Bgetrune(finput);
                 lineno++;
         }
-        Bprint(ftable, "\n#line\t%d\t\"%s\"\n", lineno, infile);
+        Bprint(ftable, "\n");
+        if(yyline)
+                Bprint(ftable, "#line\t%d\t\"%s\"\n", lineno, infile);
         while(c != Beof) {
                 if(c == '\\') {
                         if((c=Bgetrune(finput)) == '}')
t@@ -1947,7 +1980,9 @@ cpyact(int offset)
         long c;
         int brac, match, j, s, fnd, tok;
 
-        Bprint(faction, "\n#line\t%d\t\"%s\"\n", lineno, infile);
+        Bprint(faction, "\n");
+        if(yyline)
+                Bprint(faction, "#line\t%d\t\"%s\"\n", lineno, infile);
         brac = 0;
 
 loop:
t@@ -2157,9 +2192,9 @@ output(void)
         int i, k, c;
         Wset *u, *v;
 
-        Bprint(ftable, "short        yyexca[] =\n{");
+        Bprint(ftable, "static\tconst\tshort        yyexca[] =\n{");
         if(fdebug)
-                Bprint(fdebug, "char*        yystates[] =\n{\n");
+                Bprint(fdebug, "static\tconst\tchar*        yystates[] =\n{\n");
 
         /* output the stuff for state i */
         SLOOP(i) {
t@@ -2570,7 +2605,7 @@ warray(char *s, int *v, int n)
 {
         int i;
 
-        Bprint(ftable, "short        %s[] =\n{", s);
+        Bprint(ftable, "static\tconst\tshort        %s[] =\n{", s);
         for(i=0;;) {
                 if(i%10 == 0)
                         Bprint(ftable, "\n");
t@@ -2900,7 +2935,7 @@ arout(char *s, int *v, int n)
 {
         int i;
 
-        Bprint(ftable, "short        %s[] =\n{", s);
+        Bprint(ftable, "static\tconst\tshort        %s[] =\n{", s);
         for(i = 0; i < n;) {
                 if(i%10 == 0)
                         Bprint(ftable, "\n");