116 lines
2.8 KiB
Plaintext
116 lines
2.8 KiB
Plaintext
|
.\" This module is believed to contain source code proprietary to AT&T.
|
||
|
.\" Use and redistribution is subject to the Berkeley Software License
|
||
|
.\" Agreement and your Software Agreement with AT&T (Western Electric).
|
||
|
.\"
|
||
|
.\" @(#)ssb 8.1 (Berkeley) 6/8/93
|
||
|
.\"
|
||
|
.\" $FreeBSD$
|
||
|
.SH
|
||
|
Appendix B: Yacc Input Syntax
|
||
|
.PP
|
||
|
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
|