yacc

command
v0.1.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 22, 2016 License: Apache-2.0, BSD-3-Clause Imports: 10 Imported by: 0

Documentation

Overview

Yacc is a version of yacc for Go. It is written in Go and generates parsers written in Go.

Usage:

go tool yacc args...

It is largely transliterated from the Inferno version written in Limbo which in turn was largely transliterated from the Plan 9 version written in C and documented at

https://9p.io/magic/man2html/1/yacc

Adepts of the original yacc will have no trouble adapting to this form of the tool.

The directory $GOROOT/src/cmd/yacc/testdata/expr is a yacc program for a very simple expression parser. See expr.y and main.go in that directory for examples of how to write and build yacc programs.

The generated parser is reentrant. The parsing function yyParse expects to be given an argument that conforms to the following interface:

type yyLexer interface {
	Lex(lval *yySymType) int
	Error(e string)
}

Lex should return the token identifier, and place other token information in lval (which replaces the usual yylval). Error is equivalent to yyerror in the original yacc.

Code inside the grammar actions may refer to the variable yylex, which holds the yyLexer passed to yyParse.

Clients that need to understand more about the parser state can create the parser separately from invoking it. The function yyNewParser returns a yyParser conforming to the following interface:

type yyParser interface {
	Parse(yyLex) int
	Lookahead() int
}

Parse runs the parser; the top-level call yyParse(yylex) is equivalent to yyNewParser().Parse(yylex).

Lookahead can be called during grammar actions to read (but not consume) the value of the current lookahead token, as returned by yylex.Lex. If there is no current lookahead token (because the parser has not called Lex or has consumed the token returned by the most recent call to Lex), Lookahead returns -1. Calling Lookahead is equivalent to reading yychar from within in a grammar action.

Multiple grammars compiled into a single program should be placed in distinct packages. If that is impossible, the "-p prefix" flag to yacc sets the prefix, by default yy, that begins the names of symbols, including types, the parser, and the lexer, generated and referenced by yacc's generated code. Setting it to distinct values allows multiple grammars to be placed in a single package.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL