📄 sec-directives.html
字号:
<HTML
><HEAD
><TITLE
>Directives</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.74b"><LINK
REL="HOME"
TITLE="Happy User Guide"
HREF="happy.html"><LINK
REL="UP"
TITLE="Syntax of Grammar Files"
HREF="sec-grammar-files.html"><LINK
REL="PREVIOUS"
TITLE="Module Header"
HREF="sec-module-header.html"><LINK
REL="NEXT"
TITLE="Grammar"
HREF="sec-grammar.html"></HEAD
><BODY
CLASS="SECT1"
><DIV
CLASS="NAVHEADER"
><TABLE
SUMMARY="Header navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Happy User Guide</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="sec-module-header.html"
ACCESSKEY="P"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
>Chapter 4. Syntax of Grammar Files</TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="sec-grammar.html"
ACCESSKEY="N"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="SECT1"
><H1
CLASS="SECT1"
><A
NAME="SEC-DIRECTIVES"
>4.3. Directives</A
></H1
><P
>This section contains a number of lines of the form:</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>%<directive name> <argument> ...</PRE
></TD
></TR
></TABLE
><P
>The statements here are all annotations to help
<SPAN
CLASS="APPLICATION"
>Happy</SPAN
> generate the Haskell code for the grammar.
Some of them are optional, and some of them are required.</P
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="SEC-TOKEN-TYPE"
>4.3.1. Token Type</A
></H2
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>%tokentype { <valid Haskell type> }</PRE
></TD
></TR
></TABLE
><P
>(mandatory) The <TT
CLASS="LITERAL"
>%tokentype</TT
> directive gives the
type of the tokens passed from the lexical analyser to the
parser (in order that <SPAN
CLASS="APPLICATION"
>Happy</SPAN
> can supply types for
functions and data in the generated parser).</P
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="SEC-TOKENS"
>4.3.2. Tokens</A
></H2
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>%token <name> { <Haskell pattern> }
<name> { <Haskell pattern> }
...</PRE
></TD
></TR
></TABLE
><P
>(mandatory) The <TT
CLASS="LITERAL"
>%token</TT
> directive is used to
tell <SPAN
CLASS="APPLICATION"
>Happy</SPAN
> about all the terminal symbols used
in the grammar. Each terminal has a name, by which it is
referred to in the grammar itself, and a Haskell
representation enclosed in braces. Each of the patterns must
be of the same type, given by the <TT
CLASS="LITERAL"
>%tokentype</TT
>
directive.</P
><P
>The name of each terminal follows the lexical rules for
<SPAN
CLASS="APPLICATION"
>Happy</SPAN
> identifiers given above. There are no
lexical differences between terminals and non-terminals in the
grammar, so it is recommended that you stick to a convention;
for example using upper case letters for terminals and lower
case for non-terminals, or vice-versa.</P
><P
><SPAN
CLASS="APPLICATION"
>Happy</SPAN
> will give you a warning if you try
to use the same identifier both as a non-terminal and a
terminal, or introduce an identifier which is declared as
neither.</P
><P
>To save writing lots of projection functions that map
tokens to their components, you can include
<TT
CLASS="LITERAL"
>$$</TT
> in your Haskell pattern. For
example:</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>%token INT { TokenInt $$ }
...</PRE
></TD
></TR
></TABLE
><P
>This makes the semantic value of <TT
CLASS="LITERAL"
>INT</TT
> refer to the first argument
of <TT
CLASS="LITERAL"
>TokenInt</TT
> rather than the whole token, eliminating the need for
any projection function.</P
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="SEC-PARSER-NAME"
>4.3.3. Parser Name</A
></H2
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>%name <Haskell identifier> [ <non-terminal> ]
...</PRE
></TD
></TR
></TABLE
><P
>(optional) The <TT
CLASS="LITERAL"
>%name</TT
> directive is followed by
a valid Haskell identifier, and gives the name of the
top-level parsing function in the generated parser. This is
the only function that needs to be exported from a parser
module.</P
><P
>If the <TT
CLASS="LITERAL"
>%name</TT
> directive is omitted, it
defaults to <TT
CLASS="LITERAL"
>happyParse</TT
>.</P
><P
>The <TT
CLASS="LITERAL"
>%name</TT
> directive takes an optional
second parameter which specifies the top-level non-terminal
which is to be parsed. If this parameter is omitted, it
defaults to the first non-terminal defined in the
grammar.</P
><P
>Multiple <TT
CLASS="LITERAL"
>%name</TT
> directives may be
given, specifying multiple parser entry points for this
grammar (see <A
HREF="sec-multiple-parsers.html"
>Section 2.7</A
>). When
multiple <TT
CLASS="LITERAL"
>%name</TT
> directives are given, they
must all specify explicit non-terminals.</P
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="SEC-MONAD-DECL"
>4.3.4. Monad Directive</A
></H2
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>%monad { <type> } { <then> } { <return> }</PRE
></TD
></TR
></TABLE
><P
>(optional) The <TT
CLASS="LITERAL"
>%monad</TT
> directive takes three
arguments: the type constructor of the monad, the
<TT
CLASS="LITERAL"
>then</TT
> (or <TT
CLASS="LITERAL"
>bind</TT
>) operation, and the
<TT
CLASS="LITERAL"
>return</TT
> (or <TT
CLASS="LITERAL"
>unit</TT
>) operation. The type
constructor can be any type with kind <TT
CLASS="LITERAL"
>* -> *</TT
>.</P
><P
>Monad declarations are described in more detail in <A
HREF="sec-monads.html"
>Section 2.5</A
>.</P
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="SEC-LEXER-DECL"
>4.3.5. Lexical Analyser</A
></H2
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>%lexer { <lexer> } { <eof> }</PRE
></TD
></TR
></TABLE
><P
>(optional) The <TT
CLASS="LITERAL"
>%lexer</TT
> directive takes two
arguments: <TT
CLASS="LITERAL"
><lexer></TT
> is the name of the lexical
analyser function, and <TT
CLASS="LITERAL"
><eof></TT
> is a token that
is to be treated as the end of file.</P
><P
>Lexer declarations are described in more detail in <A
HREF="sec-monads.html#SEC-LEXERS"
>Section 2.5.2</A
>.</P
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="SEC-PREC-DECLS"
>4.3.6. Precedence declarations</A
></H2
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>%left <name> ...
%right <name> ...
%nonassoc <name> ...</PRE
></TD
></TR
></TABLE
><P
>These declarations are used to specify the precedences
and associativity of tokens. The precedence assigned by a
<TT
CLASS="LITERAL"
>%left</TT
>, <TT
CLASS="LITERAL"
>%right</TT
> or
<TT
CLASS="LITERAL"
>%nonassoc</TT
> declaration is defined to be
higher than the precedence assigned by all declarations
earlier in the file, and lower than the precedence assigned by
all declarations later in the file.</P
><P
>The associativity of a token relative to tokens in the
same <TT
CLASS="LITERAL"
>%left</TT
>, <TT
CLASS="LITERAL"
>%right</TT
>, or
<TT
CLASS="LITERAL"
>%nonassoc</TT
> declaration is to the left, to
the right, or non-associative respectively.</P
><P
>Precedence declarations are described in more detail in
<A
HREF="sec-precedences.html"
>Section 2.3</A
>.</P
></DIV
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
SUMMARY="Footer navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="sec-module-header.html"
ACCESSKEY="P"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="happy.html"
ACCESSKEY="H"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="sec-grammar.html"
ACCESSKEY="N"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Module Header</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="sec-grammar-files.html"
ACCESSKEY="U"
>Up</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Grammar</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -