%% File generated by the BNF Converter. \batchmode \documentclass[a4paper,11pt]{article} \usepackage[T1]{fontenc} \usepackage[utf8x]{inputenc} \setlength{\parindent}{0mm} \setlength{\parskip}{1mm} \title{The Language C} \author{BNF-converter} \begin{document} \maketitle \newcommand{\emptyP}{\mbox{$\epsilon$}} \newcommand{\terminal}[1]{\mbox{{\texttt {#1}}}} \newcommand{\nonterminal}[1]{\mbox{$\langle \mbox{{\sl #1 }} \! \rangle$}} \newcommand{\arrow}{\mbox{::=}} \newcommand{\delimit}{\mbox{$|$}} \newcommand{\reserved}[1]{\mbox{{\texttt {#1}}}} \newcommand{\literal}[1]{\mbox{{\texttt {#1}}}} \newcommand{\symb}[1]{\mbox{{\texttt {#1}}}} This document was automatically generated by the {\em BNF-Converter}. \section*{The lexical structure of C} \subsection*{Literals} Character literals \nonterminal{Char}\ have the form \terminal{'}$c$\terminal{'}, where $c$ is any single character. Double-precision float literals \nonterminal{Double}\ have the structure indicated by the regular expression $\nonterminal{digit}+ \mbox{{\it `.'}} \nonterminal{digit}+ (\mbox{{\it `e'}} \mbox{{\it `-'}}? \nonterminal{digit}+)?$ i.e.\ two sequences of digits separated by a decimal point, optionally followed by an unsigned or negative exponent. Integer literals \nonterminal{Int}\ are nonempty sequences of digits. String literals \nonterminal{String}\ have the form \terminal{"}$x$\terminal{"}, where $x$ is any sequence of any characters except \terminal{"}\ unless preceded by \verb6\6. CDouble literals are recognized by the regular expression \((({\nonterminal{digit}})+ (\mbox{`.'}) \mid (\mbox{`.'}) ({\nonterminal{digit}})+) ((\mbox{`e'} \mid \mbox{`E'}) (\mbox{`{$-$}'})? ({\nonterminal{digit}})+)? \mid ({\nonterminal{digit}})+ (\mbox{`e'} \mid \mbox{`E'}) (\mbox{`{$-$}'})? ({\nonterminal{digit}})+ \mid ({\nonterminal{digit}})+ (\mbox{`.'}) ({\nonterminal{digit}})+ (\mbox{`E'}) (\mbox{`{$-$}'})? ({\nonterminal{digit}})+\) CFloat literals are recognized by the regular expression \((({\nonterminal{digit}})+ (\mbox{`.'}) ({\nonterminal{digit}})+ \mid ({\nonterminal{digit}})+ (\mbox{`.'}) \mid (\mbox{`.'}) ({\nonterminal{digit}})+) ((\mbox{`e'} \mid \mbox{`E'}) (\mbox{`{$-$}'})? ({\nonterminal{digit}})+)? (\mbox{`f'} \mid \mbox{`F'}) \mid ({\nonterminal{digit}})+ (\mbox{`e'} \mid \mbox{`E'}) (\mbox{`{$-$}'})? ({\nonterminal{digit}})+ (\mbox{`f'} \mid \mbox{`F'})\) CLongDouble literals are recognized by the regular expression \((({\nonterminal{digit}})+ (\mbox{`.'}) ({\nonterminal{digit}})+ \mid ({\nonterminal{digit}})+ (\mbox{`.'}) \mid (\mbox{`.'}) ({\nonterminal{digit}})+) ((\mbox{`e'} \mid \mbox{`E'}) (\mbox{`{$-$}'})? ({\nonterminal{digit}})+)? (\mbox{`l'} \mid \mbox{`L'}) \mid ({\nonterminal{digit}})+ (\mbox{`e'} \mid \mbox{`E'}) (\mbox{`{$-$}'})? ({\nonterminal{digit}})+ (\mbox{`l'} \mid \mbox{`L'})\) HexLong literals are recognized by the regular expression \((\mbox{`0'}) (\mbox{`x'} \mid \mbox{`X'}) ({\nonterminal{digit}} \mid \mbox{`a'} \mid \mbox{`b'} \mid \mbox{`c'} \mid \mbox{`d'} \mid \mbox{`e'} \mid \mbox{`f'} \mid \mbox{`A'} \mid \mbox{`B'} \mid \mbox{`C'} \mid \mbox{`D'} \mid \mbox{`E'} \mid \mbox{`F'})+ (\mbox{`l'} \mid \mbox{`L'})\) HexUnsLong literals are recognized by the regular expression \((\mbox{`0'}) (\mbox{`x'} \mid \mbox{`X'}) ({\nonterminal{digit}} \mid \mbox{`a'} \mid \mbox{`b'} \mid \mbox{`c'} \mid \mbox{`d'} \mid \mbox{`e'} \mid \mbox{`f'} \mid \mbox{`A'} \mid \mbox{`B'} \mid \mbox{`C'} \mid \mbox{`D'} \mid \mbox{`E'} \mid \mbox{`F'})+ ((\mbox{`u'}) (\mbox{`l'}) \mid (\mbox{`U'}) (\mbox{`L'}))\) HexUnsigned literals are recognized by the regular expression \((\mbox{`0'}) (\mbox{`x'} \mid \mbox{`X'}) ({\nonterminal{digit}} \mid \mbox{`a'} \mid \mbox{`b'} \mid \mbox{`c'} \mid \mbox{`d'} \mid \mbox{`e'} \mid \mbox{`f'} \mid \mbox{`A'} \mid \mbox{`B'} \mid \mbox{`C'} \mid \mbox{`D'} \mid \mbox{`E'} \mid \mbox{`F'})+ (\mbox{`u'} \mid \mbox{`U'})\) Hexadecimal literals are recognized by the regular expression \((\mbox{`0'}) (\mbox{`x'} \mid \mbox{`X'}) ({\nonterminal{digit}} \mid \mbox{`a'} \mid \mbox{`b'} \mid \mbox{`c'} \mid \mbox{`d'} \mid \mbox{`e'} \mid \mbox{`f'} \mid \mbox{`A'} \mid \mbox{`B'} \mid \mbox{`C'} \mid \mbox{`D'} \mid \mbox{`E'} \mid \mbox{`F'})+\) Ident literals are recognized by the regular expression \(({\nonterminal{lower}} \mid {\nonterminal{upper}}) ({\nonterminal{upper}} \mid {\nonterminal{lower}} \mid {\nonterminal{digit}} \mid \mbox{`\_'} \mid \mbox{`''})*\) Long literals are recognized by the regular expression \((\mbox{`1'} \mid \mbox{`2'} \mid \mbox{`3'} \mid \mbox{`4'} \mid \mbox{`5'} \mid \mbox{`6'} \mid \mbox{`7'} \mid \mbox{`8'} \mid \mbox{`9'}) ({\nonterminal{digit}})* (\mbox{`l'} \mid \mbox{`L'})\) Octal literals are recognized by the regular expression \((\mbox{`0'}) (\mbox{`0'} \mid \mbox{`1'} \mid \mbox{`2'} \mid \mbox{`3'} \mid \mbox{`4'} \mid \mbox{`5'} \mid \mbox{`6'} \mid \mbox{`7'})*\) OctalLong literals are recognized by the regular expression \((\mbox{`0'}) (\mbox{`0'} \mid \mbox{`1'} \mid \mbox{`2'} \mid \mbox{`3'} \mid \mbox{`4'} \mid \mbox{`5'} \mid \mbox{`6'} \mid \mbox{`7'})* (\mbox{`l'} \mid \mbox{`L'})\) OctalUnsLong literals are recognized by the regular expression \((\mbox{`0'}) (\mbox{`0'} \mid \mbox{`1'} \mid \mbox{`2'} \mid \mbox{`3'} \mid \mbox{`4'} \mid \mbox{`5'} \mid \mbox{`6'} \mid \mbox{`7'})* ((\mbox{`u'}) (\mbox{`l'}) \mid (\mbox{`U'}) (\mbox{`L'}))\) OctalUnsigned literals are recognized by the regular expression \((\mbox{`0'}) (\mbox{`0'} \mid \mbox{`1'} \mid \mbox{`2'} \mid \mbox{`3'} \mid \mbox{`4'} \mid \mbox{`5'} \mid \mbox{`6'} \mid \mbox{`7'})* (\mbox{`u'} \mid \mbox{`U'})\) Unsigned literals are recognized by the regular expression \((\mbox{`1'} \mid \mbox{`2'} \mid \mbox{`3'} \mid \mbox{`4'} \mid \mbox{`5'} \mid \mbox{`6'} \mid \mbox{`7'} \mid \mbox{`8'} \mid \mbox{`9'}) ({\nonterminal{digit}})* (\mbox{`u'} \mid \mbox{`U'})\) UnsignedLong literals are recognized by the regular expression \((\mbox{`1'} \mid \mbox{`2'} \mid \mbox{`3'} \mid \mbox{`4'} \mid \mbox{`5'} \mid \mbox{`6'} \mid \mbox{`7'} \mid \mbox{`8'} \mid \mbox{`9'}) ({\nonterminal{digit}})* ((\mbox{`u'}) (\mbox{`l'}) \mid (\mbox{`U'}) (\mbox{`L'}))\) \subsection*{Reserved words and symbols} The set of reserved words is the set of terminals appearing in the grammar. Those reserved words that consist of non-letter characters are called symbols, and they are treated in a different way from those that are similar to identifiers. The lexer follows rules familiar from languages like Haskell, C, and Java, including longest match and spacing conventions. The reserved words used in C are the following: \\ \begin{tabular}{lll} {\reserved{Typedef\_name}} & {\reserved{auto}} & {\reserved{break}} \\ {\reserved{case}} & {\reserved{char}} & {\reserved{const}} \\ {\reserved{continue}} & {\reserved{default}} & {\reserved{do}} \\ {\reserved{double}} & {\reserved{else}} & {\reserved{enum}} \\ {\reserved{extern}} & {\reserved{float}} & {\reserved{for}} \\ {\reserved{goto}} & {\reserved{if}} & {\reserved{int}} \\ {\reserved{long}} & {\reserved{register}} & {\reserved{return}} \\ {\reserved{short}} & {\reserved{signed}} & {\reserved{sizeof}} \\ {\reserved{static}} & {\reserved{struct}} & {\reserved{switch}} \\ {\reserved{typedef}} & {\reserved{union}} & {\reserved{unsigned}} \\ {\reserved{void}} & {\reserved{volatile}} & {\reserved{while}} \\ \end{tabular} \\ The symbols used in C are the following: \\ \begin{tabular}{lll} {\symb{!}} & {\symb{!{$=$}}} & {\symb{\%}} \\ {\symb{\%{$=$}}} & {\symb{\&}} & {\symb{\&\&}} \\ {\symb{\&{$=$}}} & {\symb{(}} & {\symb{)}} \\ {\symb{*}} & {\symb{*{$=$}}} & {\symb{{$+$}}} \\ {\symb{{$+$}{$+$}}} & {\symb{{$+$}{$=$}}} & {\symb{,}} \\ {\symb{{$-$}}} & {\symb{{$-$}{$-$}}} & {\symb{{$-$}{$=$}}} \\ {\symb{{$-$}{$>$}}} & {\symb{.}} & {\symb{...}} \\ {\symb{/}} & {\symb{/{$=$}}} & {\symb{:}} \\ {\symb{;}} & {\symb{{$<$}}} & {\symb{{$<$}{$<$}}} \\ {\symb{{$<$}{$<$}{$=$}}} & {\symb{{$<$}{$=$}}} & {\symb{{$=$}}} \\ {\symb{{$=$}{$=$}}} & {\symb{{$>$}}} & {\symb{{$>$}{$=$}}} \\ {\symb{{$>$}{$>$}}} & {\symb{{$>$}{$>$}{$=$}}} & {\symb{?}} \\ {\symb{[}} & {\symb{]}} & {\symb{{\textasciicircum}}} \\ {\symb{{\textasciicircum}{$=$}}} & {\symb{\{}} & {\symb{{$|$}}} \\ {\symb{{$|$}{$=$}}} & {\symb{{$|$}{$|$}}} & {\symb{\}}} \\ {\symb{\~{}}} & & \\ \end{tabular} \\ \subsection*{Comments} Single-line comments begin with {\symb{//}}, {\symb{\#}}. Multiple-line comments are enclosed with {\symb{/*}} and {\symb{*/}}. \section*{The syntactic structure of C} Non-terminals are enclosed between $\langle$ and $\rangle$. The symbols {\arrow} (production), {\delimit} (union) and {\emptyP} (empty rule) belong to the BNF notation. All other symbols are terminals.\\ \begin{tabular}{lll} {\nonterminal{Abstract-declarator}} & {\arrow} &{\nonterminal{Dir-abs-dec}} \\ & {\delimit} &{\nonterminal{Pointer}} {\nonterminal{Dir-abs-dec}} \\ & {\delimit} &{\nonterminal{Pointer}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{Assignment-op}} & {\arrow} &{\terminal{{$=$}}} \\ & {\delimit} &{\terminal{{$+$}{$=$}}} \\ & {\delimit} &{\terminal{\&{$=$}}} \\ & {\delimit} &{\terminal{/{$=$}}} \\ & {\delimit} &{\terminal{{$<$}{$<$}{$=$}}} \\ & {\delimit} &{\terminal{\%{$=$}}} \\ & {\delimit} &{\terminal{*{$=$}}} \\ & {\delimit} &{\terminal{{$|$}{$=$}}} \\ & {\delimit} &{\terminal{{$>$}{$>$}{$=$}}} \\ & {\delimit} &{\terminal{{$-$}{$=$}}} \\ & {\delimit} &{\terminal{{\textasciicircum}{$=$}}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{Compound-stm}} & {\arrow} &{\terminal{\{}} {\nonterminal{ListDec}} {\nonterminal{ListStm}} {\terminal{\}}} \\ & {\delimit} &{\terminal{\{}} {\terminal{\}}} \\ & {\delimit} &{\terminal{\{}} {\nonterminal{ListDec}} {\terminal{\}}} \\ & {\delimit} &{\terminal{\{}} {\nonterminal{ListStm}} {\terminal{\}}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{Constant}} & {\arrow} &{\nonterminal{CDouble}} \\ & {\delimit} &{\nonterminal{CFloat}} \\ & {\delimit} &{\nonterminal{Char}} \\ & {\delimit} &{\nonterminal{CLongDouble}} \\ & {\delimit} &{\nonterminal{Double}} \\ & {\delimit} &{\nonterminal{Double}} \\ & {\delimit} &{\nonterminal{Hexadecimal}} \\ & {\delimit} &{\nonterminal{HexLong}} \\ & {\delimit} &{\nonterminal{HexUnsigned}} \\ & {\delimit} &{\nonterminal{HexUnsLong}} \\ & {\delimit} &{\nonterminal{Integer}} \\ & {\delimit} &{\nonterminal{Long}} \\ & {\delimit} &{\nonterminal{Integer}} \\ & {\delimit} &{\nonterminal{Octal}} \\ & {\delimit} &{\nonterminal{OctalLong}} \\ & {\delimit} &{\nonterminal{OctalUnsigned}} \\ & {\delimit} &{\nonterminal{OctalUnsLong}} \\ & {\delimit} &{\nonterminal{Unsigned}} \\ & {\delimit} &{\nonterminal{UnsignedLong}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{Constant-expression}} & {\arrow} &{\nonterminal{Exp3}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{Dec}} & {\arrow} &{\nonterminal{ListDeclaration-specifier}} {\nonterminal{ListInit-declarator}} {\terminal{;}} \\ & {\delimit} &{\nonterminal{ListDeclaration-specifier}} {\terminal{;}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{Declaration-specifier}} & {\arrow} &{\nonterminal{Type-qualifier}} \\ & {\delimit} &{\nonterminal{Storage-class-specifier}} \\ & {\delimit} &{\nonterminal{Type-specifier}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{Declarator}} & {\arrow} &{\nonterminal{Pointer}} {\nonterminal{Direct-declarator}} \\ & {\delimit} &{\nonterminal{Direct-declarator}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{Dir-abs-dec}} & {\arrow} &{\terminal{[}} {\terminal{]}} \\ & {\delimit} &{\nonterminal{Dir-abs-dec}} {\terminal{[}} {\nonterminal{Constant-expression}} {\terminal{]}} \\ & {\delimit} &{\terminal{[}} {\nonterminal{Constant-expression}} {\terminal{]}} \\ & {\delimit} &{\nonterminal{Dir-abs-dec}} {\terminal{(}} {\nonterminal{Parameter-type}} {\terminal{)}} \\ & {\delimit} &{\terminal{(}} {\nonterminal{Parameter-type}} {\terminal{)}} \\ & {\delimit} &{\nonterminal{Dir-abs-dec}} {\terminal{(}} {\terminal{)}} \\ & {\delimit} &{\terminal{(}} {\terminal{)}} \\ & {\delimit} &{\nonterminal{Dir-abs-dec}} {\terminal{[}} {\terminal{]}} \\ & {\delimit} &{\terminal{(}} {\nonterminal{Abstract-declarator}} {\terminal{)}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{Direct-declarator}} & {\arrow} &{\nonterminal{Direct-declarator}} {\terminal{[}} {\terminal{]}} \\ & {\delimit} &{\nonterminal{Direct-declarator}} {\terminal{[}} {\nonterminal{Constant-expression}} {\terminal{]}} \\ & {\delimit} &{\nonterminal{Ident}} \\ & {\delimit} &{\nonterminal{Direct-declarator}} {\terminal{(}} {\nonterminal{Parameter-type}} {\terminal{)}} \\ & {\delimit} &{\nonterminal{Direct-declarator}} {\terminal{(}} {\terminal{)}} \\ & {\delimit} &{\nonterminal{Direct-declarator}} {\terminal{(}} {\nonterminal{ListIdent}} {\terminal{)}} \\ & {\delimit} &{\terminal{(}} {\nonterminal{Declarator}} {\terminal{)}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{Enum-specifier}} & {\arrow} &{\terminal{enum}} {\terminal{\{}} {\nonterminal{ListEnumerator}} {\terminal{\}}} \\ & {\delimit} &{\terminal{enum}} {\nonterminal{Ident}} {\terminal{\{}} {\nonterminal{ListEnumerator}} {\terminal{\}}} \\ & {\delimit} &{\terminal{enum}} {\nonterminal{Ident}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{Enumerator}} & {\arrow} &{\nonterminal{Ident}} {\terminal{{$=$}}} {\nonterminal{Constant-expression}} \\ & {\delimit} &{\nonterminal{Ident}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{Exp}} & {\arrow} &{\nonterminal{Exp}} {\terminal{,}} {\nonterminal{Exp2}} \\ & {\delimit} &{\nonterminal{Exp2}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{Expression-stm}} & {\arrow} &{\terminal{;}} \\ & {\delimit} &{\nonterminal{Exp}} {\terminal{;}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{External-declaration}} & {\arrow} &{\nonterminal{Function-def}} \\ & {\delimit} &{\nonterminal{Dec}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{Function-def}} & {\arrow} &{\nonterminal{ListDeclaration-specifier}} {\nonterminal{Declarator}} {\nonterminal{Compound-stm}} \\ & {\delimit} &{\nonterminal{Declarator}} {\nonterminal{Compound-stm}} \\ & {\delimit} &{\nonterminal{ListDeclaration-specifier}} {\nonterminal{Declarator}} {\nonterminal{ListDec}} {\nonterminal{Compound-stm}} \\ & {\delimit} &{\nonterminal{Declarator}} {\nonterminal{ListDec}} {\nonterminal{Compound-stm}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{Init-declarator}} & {\arrow} &{\nonterminal{Declarator}} {\terminal{{$=$}}} {\nonterminal{Initializer}} \\ & {\delimit} &{\nonterminal{Declarator}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{Initializer}} & {\arrow} &{\nonterminal{Exp2}} \\ & {\delimit} &{\terminal{\{}} {\nonterminal{Initializers}} {\terminal{\}}} \\ & {\delimit} &{\terminal{\{}} {\nonterminal{Initializers}} {\terminal{,}} {\terminal{\}}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{Initializers}} & {\arrow} &{\nonterminal{Initializer}} \\ & {\delimit} &{\nonterminal{Initializers}} {\terminal{,}} {\nonterminal{Initializer}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{Iter-stm}} & {\arrow} &{\terminal{for}} {\terminal{(}} {\nonterminal{Expression-stm}} {\nonterminal{Expression-stm}} {\nonterminal{Exp}} {\terminal{)}} {\nonterminal{Stm}} \\ & {\delimit} &{\terminal{while}} {\terminal{(}} {\nonterminal{Exp}} {\terminal{)}} {\nonterminal{Stm}} \\ & {\delimit} &{\terminal{for}} {\terminal{(}} {\nonterminal{Expression-stm}} {\nonterminal{Expression-stm}} {\terminal{)}} {\nonterminal{Stm}} \\ & {\delimit} &{\terminal{do}} {\nonterminal{Stm}} {\terminal{while}} {\terminal{(}} {\nonterminal{Exp}} {\terminal{)}} {\terminal{;}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{Jump-stm}} & {\arrow} &{\terminal{return}} {\nonterminal{Exp}} {\terminal{;}} \\ & {\delimit} &{\terminal{return}} {\terminal{;}} \\ & {\delimit} &{\terminal{goto}} {\nonterminal{Ident}} {\terminal{;}} \\ & {\delimit} &{\terminal{break}} {\terminal{;}} \\ & {\delimit} &{\terminal{continue}} {\terminal{;}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{Labeled-stm}} & {\arrow} &{\nonterminal{Ident}} {\terminal{:}} {\nonterminal{Stm}} \\ & {\delimit} &{\terminal{default}} {\terminal{:}} {\nonterminal{Stm}} \\ & {\delimit} &{\terminal{case}} {\nonterminal{Constant-expression}} {\terminal{:}} {\nonterminal{Stm}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{Parameter-declaration}} & {\arrow} &{\nonterminal{ListDeclaration-specifier}} {\nonterminal{Abstract-declarator}} \\ & {\delimit} &{\nonterminal{ListDeclaration-specifier}} \\ & {\delimit} &{\nonterminal{ListDeclaration-specifier}} {\nonterminal{Declarator}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{Parameter-declarations}} & {\arrow} &{\nonterminal{Parameter-declarations}} {\terminal{,}} {\nonterminal{Parameter-declaration}} \\ & {\delimit} &{\nonterminal{Parameter-declaration}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{Parameter-type}} & {\arrow} &{\nonterminal{Parameter-declarations}} \\ & {\delimit} &{\nonterminal{Parameter-declarations}} {\terminal{,}} {\terminal{...}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{Pointer}} & {\arrow} &{\terminal{*}} \\ & {\delimit} &{\terminal{*}} {\nonterminal{Pointer}} \\ & {\delimit} &{\terminal{*}} {\nonterminal{ListType-qualifier}} \\ & {\delimit} &{\terminal{*}} {\nonterminal{ListType-qualifier}} {\nonterminal{Pointer}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{Program}} & {\arrow} &{\nonterminal{ListExternal-declaration}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{Selection-stm}} & {\arrow} &{\terminal{if}} {\terminal{(}} {\nonterminal{Exp}} {\terminal{)}} {\nonterminal{Stm}} \\ & {\delimit} &{\terminal{switch}} {\terminal{(}} {\nonterminal{Exp}} {\terminal{)}} {\nonterminal{Stm}} \\ & {\delimit} &{\terminal{if}} {\terminal{(}} {\nonterminal{Exp}} {\terminal{)}} {\nonterminal{Stm}} {\terminal{else}} {\nonterminal{Stm}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{Spec-qual}} & {\arrow} &{\nonterminal{Type-qualifier}} \\ & {\delimit} &{\nonterminal{Type-specifier}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{Stm}} & {\arrow} &{\nonterminal{Compound-stm}} \\ & {\delimit} &{\nonterminal{Expression-stm}} \\ & {\delimit} &{\nonterminal{Iter-stm}} \\ & {\delimit} &{\nonterminal{Jump-stm}} \\ & {\delimit} &{\nonterminal{Labeled-stm}} \\ & {\delimit} &{\nonterminal{Selection-stm}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{Storage-class-specifier}} & {\arrow} &{\terminal{extern}} \\ & {\delimit} &{\terminal{auto}} \\ & {\delimit} &{\terminal{static}} \\ & {\delimit} &{\terminal{register}} \\ & {\delimit} &{\terminal{typedef}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{Struct-dec}} & {\arrow} &{\nonterminal{ListSpec-qual}} {\nonterminal{ListStruct-declarator}} {\terminal{;}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{Struct-declarator}} & {\arrow} &{\nonterminal{Declarator}} {\terminal{:}} {\nonterminal{Constant-expression}} \\ & {\delimit} &{\nonterminal{Declarator}} \\ & {\delimit} &{\terminal{:}} {\nonterminal{Constant-expression}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{Struct-or-union}} & {\arrow} &{\terminal{struct}} \\ & {\delimit} &{\terminal{union}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{Struct-or-union-spec}} & {\arrow} &{\nonterminal{Struct-or-union}} {\nonterminal{Ident}} {\terminal{\{}} {\nonterminal{ListStruct-dec}} {\terminal{\}}} \\ & {\delimit} &{\nonterminal{Struct-or-union}} {\nonterminal{Ident}} \\ & {\delimit} &{\nonterminal{Struct-or-union}} {\terminal{\{}} {\nonterminal{ListStruct-dec}} {\terminal{\}}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{Type-name}} & {\arrow} &{\nonterminal{ListSpec-qual}} {\nonterminal{Abstract-declarator}} \\ & {\delimit} &{\nonterminal{ListSpec-qual}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{Type-qualifier}} & {\arrow} &{\terminal{const}} \\ & {\delimit} &{\terminal{volatile}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{Type-specifier}} & {\arrow} &{\terminal{char}} \\ & {\delimit} &{\terminal{double}} \\ & {\delimit} &{\nonterminal{Enum-specifier}} \\ & {\delimit} &{\terminal{float}} \\ & {\delimit} &{\terminal{int}} \\ & {\delimit} &{\terminal{long}} \\ & {\delimit} &{\terminal{Typedef\_name}} \\ & {\delimit} &{\terminal{short}} \\ & {\delimit} &{\terminal{signed}} \\ & {\delimit} &{\nonterminal{Struct-or-union-spec}} \\ & {\delimit} &{\terminal{unsigned}} \\ & {\delimit} &{\terminal{void}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{Unary-operator}} & {\arrow} &{\terminal{\&}} \\ & {\delimit} &{\terminal{\~{}}} \\ & {\delimit} &{\terminal{*}} \\ & {\delimit} &{\terminal{!}} \\ & {\delimit} &{\terminal{{$-$}}} \\ & {\delimit} &{\terminal{{$+$}}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{ListIdent}} & {\arrow} &{\nonterminal{Ident}} \\ & {\delimit} &{\nonterminal{Ident}} {\terminal{,}} {\nonterminal{ListIdent}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{ListDec}} & {\arrow} &{\nonterminal{Dec}} \\ & {\delimit} &{\nonterminal{Dec}} {\nonterminal{ListDec}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{ListDeclaration-specifier}} & {\arrow} &{\nonterminal{Declaration-specifier}} \\ & {\delimit} &{\nonterminal{Declaration-specifier}} {\nonterminal{ListDeclaration-specifier}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{ListEnumerator}} & {\arrow} &{\nonterminal{Enumerator}} \\ & {\delimit} &{\nonterminal{Enumerator}} {\terminal{,}} {\nonterminal{ListEnumerator}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{ListExternal-declaration}} & {\arrow} &{\nonterminal{External-declaration}} \\ & {\delimit} &{\nonterminal{External-declaration}} {\nonterminal{ListExternal-declaration}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{ListInit-declarator}} & {\arrow} &{\nonterminal{Init-declarator}} \\ & {\delimit} &{\nonterminal{Init-declarator}} {\terminal{,}} {\nonterminal{ListInit-declarator}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{ListSpec-qual}} & {\arrow} &{\nonterminal{Spec-qual}} \\ & {\delimit} &{\nonterminal{Spec-qual}} {\nonterminal{ListSpec-qual}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{ListStm}} & {\arrow} &{\nonterminal{Stm}} \\ & {\delimit} &{\nonterminal{Stm}} {\nonterminal{ListStm}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{ListStruct-dec}} & {\arrow} &{\nonterminal{Struct-dec}} \\ & {\delimit} &{\nonterminal{Struct-dec}} {\nonterminal{ListStruct-dec}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{ListStruct-declarator}} & {\arrow} &{\nonterminal{Struct-declarator}} \\ & {\delimit} &{\nonterminal{Struct-declarator}} {\terminal{,}} {\nonterminal{ListStruct-declarator}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{ListType-qualifier}} & {\arrow} &{\nonterminal{Type-qualifier}} \\ & {\delimit} &{\nonterminal{Type-qualifier}} {\nonterminal{ListType-qualifier}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{ListExp2}} & {\arrow} &{\nonterminal{Exp2}} \\ & {\delimit} &{\nonterminal{Exp2}} {\terminal{,}} {\nonterminal{ListExp2}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{Exp2}} & {\arrow} &{\nonterminal{Exp15}} {\nonterminal{Assignment-op}} {\nonterminal{Exp2}} \\ & {\delimit} &{\nonterminal{Exp3}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{Exp3}} & {\arrow} &{\nonterminal{Exp4}} {\terminal{?}} {\nonterminal{Exp}} {\terminal{:}} {\nonterminal{Exp3}} \\ & {\delimit} &{\nonterminal{Exp4}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{Exp4}} & {\arrow} &{\nonterminal{Exp4}} {\terminal{{$|$}{$|$}}} {\nonterminal{Exp5}} \\ & {\delimit} &{\nonterminal{Exp5}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{Exp5}} & {\arrow} &{\nonterminal{Exp5}} {\terminal{\&\&}} {\nonterminal{Exp6}} \\ & {\delimit} &{\nonterminal{Exp6}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{Exp6}} & {\arrow} &{\nonterminal{Exp6}} {\terminal{{$|$}}} {\nonterminal{Exp7}} \\ & {\delimit} &{\nonterminal{Exp7}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{Exp7}} & {\arrow} &{\nonterminal{Exp7}} {\terminal{{\textasciicircum}}} {\nonterminal{Exp8}} \\ & {\delimit} &{\nonterminal{Exp8}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{Exp8}} & {\arrow} &{\nonterminal{Exp8}} {\terminal{\&}} {\nonterminal{Exp9}} \\ & {\delimit} &{\nonterminal{Exp9}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{Exp9}} & {\arrow} &{\nonterminal{Exp9}} {\terminal{{$=$}{$=$}}} {\nonterminal{Exp10}} \\ & {\delimit} &{\nonterminal{Exp9}} {\terminal{!{$=$}}} {\nonterminal{Exp10}} \\ & {\delimit} &{\nonterminal{Exp10}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{Exp10}} & {\arrow} &{\nonterminal{Exp10}} {\terminal{{$>$}{$=$}}} {\nonterminal{Exp11}} \\ & {\delimit} &{\nonterminal{Exp10}} {\terminal{{$>$}}} {\nonterminal{Exp11}} \\ & {\delimit} &{\nonterminal{Exp10}} {\terminal{{$<$}{$=$}}} {\nonterminal{Exp11}} \\ & {\delimit} &{\nonterminal{Exp10}} {\terminal{{$<$}}} {\nonterminal{Exp11}} \\ & {\delimit} &{\nonterminal{Exp11}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{Exp11}} & {\arrow} &{\nonterminal{Exp11}} {\terminal{{$<$}{$<$}}} {\nonterminal{Exp12}} \\ & {\delimit} &{\nonterminal{Exp11}} {\terminal{{$>$}{$>$}}} {\nonterminal{Exp12}} \\ & {\delimit} &{\nonterminal{Exp12}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{Exp12}} & {\arrow} &{\nonterminal{Exp12}} {\terminal{{$-$}}} {\nonterminal{Exp13}} \\ & {\delimit} &{\nonterminal{Exp12}} {\terminal{{$+$}}} {\nonterminal{Exp13}} \\ & {\delimit} &{\nonterminal{Exp13}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{Exp13}} & {\arrow} &{\nonterminal{Exp13}} {\terminal{/}} {\nonterminal{Exp14}} \\ & {\delimit} &{\nonterminal{Exp13}} {\terminal{\%}} {\nonterminal{Exp14}} \\ & {\delimit} &{\nonterminal{Exp13}} {\terminal{*}} {\nonterminal{Exp14}} \\ & {\delimit} &{\nonterminal{Exp14}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{Exp14}} & {\arrow} &{\terminal{(}} {\nonterminal{Type-name}} {\terminal{)}} {\nonterminal{Exp14}} \\ & {\delimit} &{\nonterminal{Exp15}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{Exp15}} & {\arrow} &{\terminal{sizeof}} {\nonterminal{Exp15}} \\ & {\delimit} &{\terminal{sizeof}} {\terminal{(}} {\nonterminal{Type-name}} {\terminal{)}} \\ & {\delimit} &{\terminal{{$-$}{$-$}}} {\nonterminal{Exp15}} \\ & {\delimit} &{\terminal{{$+$}{$+$}}} {\nonterminal{Exp15}} \\ & {\delimit} &{\nonterminal{Unary-operator}} {\nonterminal{Exp14}} \\ & {\delimit} &{\nonterminal{Exp16}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{Exp16}} & {\arrow} &{\nonterminal{Exp16}} {\terminal{[}} {\nonterminal{Exp}} {\terminal{]}} \\ & {\delimit} &{\nonterminal{Exp16}} {\terminal{(}} {\terminal{)}} \\ & {\delimit} &{\nonterminal{Exp16}} {\terminal{(}} {\nonterminal{ListExp2}} {\terminal{)}} \\ & {\delimit} &{\nonterminal{Exp16}} {\terminal{{$-$}{$>$}}} {\nonterminal{Ident}} \\ & {\delimit} &{\nonterminal{Exp16}} {\terminal{{$-$}{$-$}}} \\ & {\delimit} &{\nonterminal{Exp16}} {\terminal{{$+$}{$+$}}} \\ & {\delimit} &{\nonterminal{Exp16}} {\terminal{.}} {\nonterminal{Ident}} \\ & {\delimit} &{\nonterminal{Exp17}} \\ \end{tabular} \\ \begin{tabular}{lll} {\nonterminal{Exp17}} & {\arrow} &{\nonterminal{Constant}} \\ & {\delimit} &{\nonterminal{String}} \\ & {\delimit} &{\nonterminal{Ident}} \\ & {\delimit} &{\terminal{(}} {\nonterminal{Exp}} {\terminal{)}} \\ \end{tabular} \\ \end{document}