Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ (1) — Plan9 4th Edition

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

lex(1)

YACC(1)

NAME

yacc − yet another compiler-compiler

SYNOPSIS

­yacc [ ­option ...  ] ­grammar

DESCRIPTION

­Yacc converts a context-free grammar and translation code into a set of tables for an LR(1) parser and translator.  The grammar may be ambiguous; specified precedence rules are used to break ambiguities. 

The output file, y.tab.c, must be compiled by the C compiler to produce a program yyparse.  This program must be loaded with a lexical analyzer function, ­yylex(void) (often generated by lex(1)), with a ­main(int argc, char ∗argv[]) program, and with an error handling routine, yyerror(char∗). 

The options are

-o output Direct output to the specified file instead of y.tab.c. 

-Dn Create file y.debug, containing diagnostic messages.  To incorporate them in the parser, compile it with preprocessor symbol ­yydebug defined.  The amount of diagnostic output from the parser is regulated by value n. The value 0 reports errors; 1 reports reductions; higher values (up to 4) include more information about state transitions.

­-v Create file y.output, containing a description of the parsing tables and of conflicts arising from ambiguities in the grammar. 

­-d Create file y.tab.h, containing ­#define statements that associate yacc-assigned ‘token codes’ with user-declared ‘token names’. Include it in source files other than ­y.tab.c to give access to the token codes. 

-s stem Change the prefix ­y of the file names y.tab.c, y.tab.h, y.debug, and ­y.output to stem.

­-S Write a parser that uses Stdio instead of the ­print routines in libc. 

The specification of ­yacc itself is essentially the same as the UNIX version described in the references mentioned below.  Besides the ­-D option, the main relevant differences are:

The interface to the C environment is by default through ­<libc.h> rather than <stdio.h>; the ­-S option reverses this. 

The parser accepts UTF input text (see utf(6)), which has a couple of effects. First, the return value of ­yylex() no longer fits in a short; second, the starting value for non-terminals is now 0xE000 rather than 257. 

The generated parser can be recursive: actions can call yyparse, for example to implement a sort of ­#include statement in an interpreter. 

Finally, some undocumented inner workings of the parser have been changed, which may affect programs that know too much about its structure. 

FILES

­y.output

­y.tab.c

­y.tab.h

­y.debug

­y.tmp.∗ temporary file

­y.acts.∗ temporary file

­/sys/lib/yaccpar
parser prototype

­/sys/lib/yaccpars
parser prototype using stdio

SOURCE

­/sys/src/cmd/yacc.c

SEE ALSO

lex(1)
S. C. Johnson and R. Sethi, “Yacc: A parser generator”, Unix Research System Programmer’s Manual, Tenth Edition, Volume 2
B. W. Kernighan and Rob Pike, The UNIX Programming Environment, Prentice Hall, 1984

BUGS

The parser may not have full information when it writes to ­y.debug so that the names of the tokens returned by ­yylex may be missing. 

Plan 9  —  December 11, 1999

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026