Research V7 release
[unix-history] / usr / doc / yacc / ssb
index 497a174..8d7cfc6 100644 (file)
 .SH
 .SH
-Appendix B: Use of Yacc on Unix
+Appendix B: Yacc Input Syntax
 .PP
 .PP
-Suppose that the Yacc specification is on a file called
-yfile.
-If the actions are in C, Yacc is invoked by
-.DS
-yacc yfile
-.DE
-The output appears on file y.tab.c 
-To compile the parser and load it with
-the Yacc library, use the command
-.DS
-cc y.tab.c \-ly
-.DE
-If Yacc is invoked with the option \-v:
-.DS
-yacc \-v yfile
-.DE
-a verbose description of the parser is produced on file y.output.
-The C user should consult section
-6C for more information about the run time environment.
-.PP
-If the actions are in Ratfor,
-the user should invoke Yacc with the option \-r:
-.DS
-yacc \-r yfile
-.DE
-The Ratfor output appears on file y.tab.r 
-It may be compiled by
-.DS
-rc \-2 y.tab.r
-.DE
-Note that when Yacc is used to produce Ratfor
-programs, there is no need to load these programs with any library.
-.PP
-If the \-v action is also invoked:
-.DS
-yacc \-rv yfile
-.DE
-a verbose description of the parser is produced on file y.output.
-The Ratfor user should consult section 6R for more information about
-the run time environment.
+This Appendix has a description of the Yacc input syntax, as a Yacc specification.
+Context dependencies, etc., are not considered.
+Ironically, the Yacc input specification language
+is most naturally specified as an LR(2) grammar; the sticky
+part comes when an identifier is seen in a rule, immediately
+following an action.
+If this identifier is followed by a colon, it is the start of the
+next rule; otherwise
+it is a continuation of the current rule, which just happens to have
+an action embedded in it.
+As implemented, the lexical analyzer looks
+ahead after seeing an identifier, and
+decide whether the next token (skipping blanks, newlines, comments, etc.)
+is a colon.
+If so, it returns the token C_IDENTIFIER.
+Otherwise, it returns IDENTIFIER.
+Literals (quoted strings) are also returned as IDENTIFIERS,
+but never as part of C_IDENTIFIERs.
+.sp
+.nf
+.ta .6i 1.2i 1.8i 2.4i 3i 3.6i
+
+            /*  grammar  for  the  input  to  Yacc  */
+
+       /*  basic  entities  */
+%token IDENTIFIER      /*   includes  identifiers   and  literals  */
+%token C_IDENTIFIER    /*    identifier  (but  not  literal)  followed  by  colon    */
+%token NUMBER          /*    [0-9]+    */
+
+       /*  reserved  words:    %type  =>  TYPE,  %left  =>  LEFT,  etc.  */
+
+%token LEFT  RIGHT  NONASSOC  TOKEN  PREC  TYPE  START  UNION
+
+%token MARK    /*  the  %%  mark  */
+%token LCURL   /*  the  %{  mark  */
+%token RCURL   /*  the  %}  mark  */
+
+       /*  ascii  character  literals  stand  for  themselves  */
+
+%start spec
+
+%%
+
+spec   :       defs  MARK  rules  tail
+       ;
+
+tail   :       MARK    {    \fIIn  this  action,  eat  up  the  rest  of  the  file\fR    }
+       |       /*  empty:  the  second  MARK  is  optional  */
+       ;
+
+defs   :       /*  empty  */
+       |       defs  def
+       ;
+
+def    :       START  IDENTIFIER
+       |       UNION  {  \fICopy union  definition  to  output\fR  }
+       |       LCURL  {  \fICopy  C  code  to  output  file\fR   }  RCURL
+       |       ndefs  rword  tag  nlist
+       ;
+
+rword  :       TOKEN
+       |       LEFT
+       |       RIGHT
+       |       NONASSOC
+       |       TYPE
+       ;
+
+tag    :       /*  empty:  union  tag  is  optional  */
+       |       \'<\'  IDENTIFIER  \'>\'
+       ;
+
+nlist  :       nmno
+       |       nlist  nmno
+       |       nlist  \',\'  nmno
+       ;
+
+nmno   :       IDENTIFIER              /*  NOTE:  literal  illegal  with  %type  */
+       |       IDENTIFIER  NUMBER      /*  NOTE:  illegal  with  %type  */
+       ;
+
+       /*  rules  section  */
+
+rules  :       C_IDENTIFIER  rbody  prec
+       |       rules  rule
+       ;
+
+rule   :       C_IDENTIFIER  rbody  prec
+       |       '|'  rbody  prec
+       ;
+
+rbody  :       /*  empty  */
+       |       rbody  IDENTIFIER
+       |       rbody  act
+       ;
+
+act    :       \'{\'  {  \fICopy  action,  translate  $$,  etc.\fR  }  \'}\'
+       ;
+
+prec   :       /*  empty  */
+       |       PREC  IDENTIFIER
+       |       PREC  IDENTIFIER  act
+       |       prec  \';\'
+       ;
+.fi
+.bp