| YACC(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`.
`−D` n 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.
`−l` Disable #line directives in the generated parser.
`−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*.

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(7)), 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
`/usr/local/plan9/lib/yaccpar
`

| parser prototype

`/usr/local/plan9/lib/yaccpars
`

| parser prototype using stdio

SOURCE

| `/usr/local/plan9/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.