| // Copyright 2009 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| /* | |
| 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 | |
| http://plan9.bell-labs.com/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. | |
| */ | |
| package main |