| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- // 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.
- /*
- Goyacc is a version of yacc for Go.
- It is written in Go and generates parsers written in Go.
- Usage:
- goyacc 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 $GOPATH/src/golang.org/x/tools/cmd/goyacc/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
- goyacc 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
- goyacc 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
|