Changeset df2be83


Ignore:
Timestamp:
Apr 11, 2016, 4:41:29 PM (6 years ago)
Author:
Aaron Moss <a3moss@…>
Branches:
aaron-thesis, arm-eh, cleanup-dtors, ctor, deferred_resn, demangler, gc_noraii, jacob/cs343-translation, jenkins-sandbox, master, memory, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, resolv-new, string, with_gc
Children:
4b8f918
Parents:
5ba653c (diff), e55ca05 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge branch 'master' of plg.uwaterloo.ca:software/cfa/cfa-cc

Files:
2 added
2 deleted
20 edited
1 moved

Legend:

Unmodified
Added
Removed
  • doc/refrat/Makefile

    r5ba653c rdf2be83  
    11## Define the appropriate configuration variables.
    22
    3 Macros =
    4 TeXLIB = .:${Macros}:
     3TeXLIB = .:../bibliography/:../LaTeXmacros/:
    54LaTeX  = TEXINPUTS=${TeXLIB} && export TEXINPUTS && latex
    6 BibTeX = BSTINPUTS=${TeXLIB} && export BSTINPUTS && bibtex
     5BibTeX = BIBINPUTS=${TeXLIB} && export BIBINPUTS && bibtex
    76
    87## Define the text source files.
     
    4443        dvips $< -o $@
    4544
    46 ${basename ${DOCUMENT}}.dvi : Makefile ${GRAPHS} ${PROGRAMS} ${PICTURES} ${FIGURES} ${SOURCES} ${basename ${DOCUMENT}}.tex ${basename ${DOCUMENT}}.bib
     45${basename ${DOCUMENT}}.dvi : Makefile ${GRAPHS} ${PROGRAMS} ${PICTURES} ${FIGURES} ${SOURCES} ${basename ${DOCUMENT}}.tex \
     46                ../LaTeXmacros/common.tex ../LaTeXmacros/indexstyle ../bibliography/cfa.bib
    4747        # Conditionally create an empty *.ind (index) file for inclusion until makeindex is run.
    4848        if [ ! -r ${basename $@}.ind ] ; then touch ${basename $@}.ind ; fi
     
    5454        -${BibTeX} ${basename $@}
    5555        # Make index from *.aux entries and input index at end of document
    56         makeindex -s indexstyle ${basename $@}.idx
     56        makeindex -s ../LaTeXmacros/indexstyle ${basename $@}.idx
    5757        ${LaTeX} ${basename $@}.tex
    5858        # Run again to get index title into table of contents
  • doc/refrat/refrat.tex

    r5ba653c rdf2be83  
    1111%% Created On       : Wed Apr  6 14:52:25 2016
    1212%% Last Modified By : Peter A. Buhr
    13 %% Last Modified On : Wed Apr  6 21:57:27 2016
    14 %% Update Count     : 2
     13%% Last Modified On : Fri Apr  8 18:32:07 2016
     14%% Update Count     : 6
    1515%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    1616
     
    3636%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    3737
    38 % Names used in the document.
    39 
    40 \newcommand{\CFA}{C$\mathbf\forall$\xspace}     % set language symbolic name
    41 \newcommand{\CFL}{Cforall\xspace}               % set language text name
    42 \newcommand{\CC}{C\kern-.1em\hbox{+\kern-.25em+}\xspace} % CC symbolic name
    43 \def\c11{ISO/IEC C} % C11 name (cannot have numbers in latex command name)
    44 
    45 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    46 
    4738% Bespoke macros used in the document.
    48 
    49 \makeatletter
    50 % allow escape sequence in lstinline
    51 %\usepackage{etoolbox}
    52 %\patchcmd{\lsthk@TextStyle}{\let\lst@DefEsc\@empty}{}{}{\errmessage{failed to patch}}
    53 
    54 \renewcommand\small{%
    55    \@setfontsize\small{8.5}{11}%
    56    \abovedisplayskip 8.5pt \@plus 3pt \@minus 4pt
    57    \abovedisplayshortskip \z@ \@plus 2pt
    58    \belowdisplayshortskip 4pt \@plus 2pt \@minus 2pt
    59    \def\@listi{\leftmargin\leftmargini
    60                \topsep 4pt \@plus 2pt \@minus 2pt
    61                \parsep 2pt \@pluspt \@minuspt
    62                \itemsep \parsep}%
    63    \belowdisplayskip \abovedisplayskip
    64 }
    65 \usepackage{relsize}            % must be after change to small
    66 
    67 \renewcommand{\labelitemi}{{\raisebox{0.25ex}{\footnotesize$\bullet$}}}
    68 \renewenvironment{itemize}{\begin{list}{\labelitemi}{\topsep=5pt\itemsep=5pt\parsep=0pt}}{\end{list}}
    69 
    70 %  Reduce size of chapter/section titles
    71 \def\@makechapterhead#1{%
    72   \vspace*{50\p@}%
    73   {\parindent \z@ \raggedright \normalfont
    74     \ifnum \c@secnumdepth >\m@ne
    75         \large\bfseries \@chapapp\space \thechapter
    76         \par\nobreak
    77         \vskip 5\p@
    78     \fi
    79     \interlinepenalty\@M
    80     \Large \bfseries #1\par\nobreak
    81     \vskip 50\p@
    82   }}
    83 \def\@makeschapterhead#1{%
    84   \vspace*{50\p@}%
    85   {\parindent \z@ \raggedright
    86     \normalfont
    87     \interlinepenalty\@M
    88     \Large \bfseries  #1\par\nobreak
    89     \vskip 50\p@
    90   }}
    91 \renewcommand\section{\@startsection{section}{1}{\z@}{-3.0ex \@plus -1ex \@minus -.2ex}{1.0ex \@plus .2ex}{\normalfont\large\bfseries}}
    92 \renewcommand\subsection{\@startsection{subsection}{2}{\z@}{-2.5ex \@plus -1ex \@minus -.2ex}{1.0ex \@plus .2ex}{\normalfont\normalsize\bfseries}}
    93 \renewcommand\subsubsection{\@startsection{subsubsection}{3}{\z@}{-2.5ex \@plus -1ex \@minus -.2ex}{1.0ex \@plus .2ex}{\normalfont\normalsize\bfseries}}
    94 \renewcommand\paragraph{\@startsection{paragraph}{4}{\z@}{-2.0ex \@plus -1ex \@minus -.2ex}{-1em}{\normalfont\normalsize\bfseries}}
    95 
    96 % index macros
    97 \newcommand{\italic}[1]{\emph{\hyperpage{#1}}}
    98 \newcommand{\definition}[1]{\textbf{\hyperpage{#1}}}
    99 \newcommand{\see}[1]{\emph{see} #1}
    100 
    101 % Define some commands that produce formatted index entries suitable for cross-references.
    102 % ``\spec'' produces entries for specifications of entities.  ``\impl'' produces entries for their
    103 % implementations, and ``\use'' for their uses.
    104 
    105 %  \newcommand{\bold}[1]{{\bf #1}}
    106 %  \def\spec{\@bsphack\begingroup
    107 %             \def\protect##1{\string##1\space}\@sanitize
    108 %             \@wrxref{|bold}}
    109 \def\impl{\@bsphack\begingroup
    110           \def\protect##1{\string##1\space}\@sanitize
    111           \@wrxref{|definition}}
    112 \newcommand{\indexcode}[1]{{\lstinline$#1$}}
    113 \def\use{\@bsphack\begingroup
    114          \def\protect##1{\string##1\space}\@sanitize
    115          \@wrxref{|hyperpage}}
    116 \def\@wrxref#1#2{\let\thepage\relax
    117     \xdef\@gtempa{\write\@indexfile{\string
    118     \indexentry{#2@{\lstinline$#2$}#1}{\thepage}}}\endgroup\@gtempa
    119     \if@nobreak \ifvmode\nobreak\fi\fi\@esphack}
    120 %\newcommand{\use}[1]{\index{#1@{\lstinline$#1$}}}
    121 %\newcommand{\impl}[1]{\index{\protect#1@{\lstinline$\protect#1$}|definition}}
    122 
    123 % inline text and lowercase index: \Index{inline and lowercase index text}
    124 % inline text and as-in index: \Index[as-is index text]{inline text}
    125 % inline text but index with different as-is text: \Index[index text]{inline text}
    126 \newcommand{\Index}{\@ifstar\@sIndex\@Index}
    127 \newcommand{\@Index}[2][\@empty]{\lowercase{\def\temp{#2}}#2\ifx#1\@empty\index{\temp}\else\index{#1@{\protect#2}}\fi}
    128 \newcommand{\@sIndex}[2][\@empty]{#2\ifx#1\@empty\index{#2}\else\index{#1@{\protect#2}}\fi}
    129 \makeatother
    130 
    131 % blocks and titles
    132 \newenvironment{rationale}{%
    133   \begin{quotation}\noindent$\Box$\enspace
    134 }{%
    135   \hfill\enspace$\Box$\end{quotation}
    136 }%
    137 \newcommand{\define}[1]{\emph{#1\/}\index{#1}}
    138 \newcommand{\rewrite}{\(\Rightarrow\)}
    139 \newcommand{\rewriterules}{\paragraph{Rewrite Rules}~\par\noindent}
    140 \newcommand{\examples}{\paragraph{Examples}~\par\noindent}
    141 \newcommand{\semantics}{\paragraph{Semantics}~\par\noindent}
    142 \newcommand{\constraints}{\paragraph{Constraints}~\par\noindent}
    143 \newcommand{\predefined}{\paragraph{Predefined Identifiers}~\par\noindent}
    144 
    145 % BNF macros
    146 \def\syntax{\paragraph{Syntax}\trivlist\parindent=.5in\item[\hskip.5in]}
    147 \let\endsyntax=\endtrivlist
    148 \newcommand{\lhs}[1]{\par{\emph{#1:}}\index{#1@{\emph{#1}}|italic}}
    149 \newcommand{\rhs}{\hfil\break\hbox{\hskip1in}}
    150 \newcommand{\oldlhs}[1]{\emph{#1: \ldots}\index{#1@{\emph{#1}}|italic}}
    151 \newcommand{\nonterm}[1]{\emph{#1\/}\index{#1@{\emph{#1}}|italic}}
    152 \newcommand{\opt}{$_{opt}$\ }
    153 
    154 % adjust varioref package with default "section" and "page" titles, and optional title with faraway page numbers
    155 % \VRef{label} => Section 2.7, \VPageref{label} => page 17
    156 % \VRef[Figure]{label} => Figure 3.4, \VPageref{label} => page 17
    157 \renewcommand{\reftextfaceafter}{\unskip}
    158 \renewcommand{\reftextfacebefore}{\unskip}
    159 \renewcommand{\reftextafter}{\unskip}
    160 \renewcommand{\reftextbefore}{\unskip}
    161 \renewcommand{\reftextfaraway}[1]{\unskip, p.~\pageref{#1}}
    162 \renewcommand{\reftextpagerange}[2]{\unskip, pp.~\pageref{#1}--\pageref{#2}}
    163 \newcommand{\VRef}[2][Section]{\ifx#1\@empty\else{#1}\nobreakspace\fi\vref{#2}}
    164 \newcommand{\VPageref}[2][page]{\ifx#1\@empty\else{#1}\nobreakspace\fi\pageref{#2}}
    165 
    166 % CFA based on ANSI C
    167 \lstdefinelanguage{CFA}[ANSI]{C}%
    168 {morekeywords={_Alignas,_Alignof,__alignof,__alignof__,asm,__asm,__asm__,_At,_Atomic,__attribute,__attribute__,auto,
    169     _Bool,catch,catchResume,choose,_Complex,__complex,__complex__,__const,__const__,disable,dtype,enable,__extension__,
    170         fallthru,finally,forall,ftype,_Generic,_Imaginary,inline,__label__,lvalue,_Noreturn,otype,restrict,_Static_assert,
    171         _Thread_local,throw,throwResume,trait,try,typeof,__typeof,__typeof__,},
    172 }%
    173 
    174 \lstset{
    175 language=CFA,
    176 columns=flexible,
    177 basicstyle=\sf\relsize{-1},
    178 tabsize=4,
    179 xleftmargin=\parindent,
    180 escapechar=@,
    181 mathescape=true,
    182 keepspaces=true,
    183 showstringspaces=false,
    184 showlines=true,
    185 aboveskip=6pt,
    186 belowskip=4pt,
    187 }%
    188 
    189 \makeatletter
    190 % replace/adjust listings characters that look bad in sanserif
    191 \lst@CCPutMacro
    192 \lst@ProcessOther{"22}{\lst@ttfamily{"}{\raisebox{0.3ex}{\ttfamily\upshape "}}} % replace double quote
    193 \lst@ProcessOther{"27}{\lst@ttfamily{'}{\raisebox{0.3ex}{\ttfamily\upshape '\hspace*{-2pt}}}} % replace single quote
    194 \lst@ProcessOther{"2D}{\lst@ttfamily{-}{\ttfamily\upshape -}} % replace minus
    195 \lst@ProcessOther{"3C}{\lst@ttfamily{<}{\texttt{<}}} % replace less than
    196 \lst@ProcessOther{"3E}{\lst@ttfamily{<}{\texttt{>}}} % replace greater than
    197 \lst@ProcessOther{"5E}{\raisebox{0.4ex}{$\scriptstyle\land\,$}} % replace circumflex
    198 \lst@ProcessOther{"5F}{\lst@ttfamily{\char95}{{\makebox[1.2ex][c]{\rule{1ex}{0.1ex}}}}} % replace underscore
    199 \lst@ProcessOther{"60}{\lst@ttfamily{`}{\raisebox{0.3ex}{\ttfamily\upshape \hspace*{-2pt}`}}} % replace backquote
    200 \lst@ProcessOther{"7E}{\raisebox{0.3ex}{$\scriptstyle\sim\,$}} % replace tilde
    201 %\lst@ProcessOther{"7E}{\raisebox{-.4ex}[1ex][0pt]{\textasciitilde}} % lower tilde
    202 \@empty\z@\@empty
    203 \makeatother
     39\input{common}
    20440
    20541\setcounter{secnumdepth}{3}     % number subsubsections
     
    24884
    24985This document is a reference manual and rationale for \CFA, a polymorphic extension of the C programming language.
    250 It makes frequent reference to the {\c11} standard \cite{ANS:C11}, and occasionally compares \CFA to {\CC} \cite{c++}.
     86It makes frequent reference to the {\c11} standard \cite{C11}, and occasionally compares \CFA to {\CC} \cite{C++}.
    25187
    25288The manual deliberately imitates the ordering of the {\c11} standard (although the section numbering differs).
     
    742578
    743579There are two notable differences between \CFA's overload resolution rules and the rules for
    744 {\CC} defined in \cite{c++}.
     580{\CC} defined in \cite{C++}.
    745581First, the result type of a function plays a role.
    746582In {\CC}, a function call must be completely resolved based on the arguments to the call in most circumstances.
     
    34063242\begin{itemize}
    34073243\item
    3408 Inside a Clu cluster \cite{clu}, the declaration of an instance states which view applies.
     3244Inside a Clu cluster \cite{CLU}, the declaration of an instance states which view applies.
    34093245Two primitives called \lstinline$up$ and \lstinline$down$ can be used to convert between the views.
    34103246\item
    3411 The Simula class \cite{Simula87} is essentially a record type.
     3247The Simula class \cite{SIMULA87} is essentially a record type.
    34123248Since the only operations on a record are member selection and assignment, which can not be overloaded, there is never any ambiguity as to whether the abstraction or the implementation view is being used.
    34133249In {\CC}
    3414 \cite{c++}, operations on class instances include assignment and ``\lstinline$&$'', which can be overloaded.
     3250\cite{C++}, operations on class instances include assignment and ``\lstinline$&$'', which can be overloaded.
    34153251A ``scope resolution'' operator can be used inside the class to specify whether the abstract or implementation version of the operation should be used.
    34163252\item
    3417 An Ada derived type definition \cite{ada} creates a new type from an old type, and also implicitly declares derived subprograms that correspond to the existing subprograms that use the old type as a parameter type or result type.
     3253An Ada derived type definition \cite{Ada} creates a new type from an old type, and also implicitly declares derived subprograms that correspond to the existing subprograms that use the old type as a parameter type or result type.
    34183254The derived subprograms are clones of the existing subprograms with the old type replaced by the derived type.
    34193255Literals and aggregates of the old type are also cloned.
     
    40283864
    40293865\bibliographystyle{plain}
    4030 \bibliography{refrat}
     3866\bibliography{cfa}
    40313867
    40323868
  • doc/user/Makefile

    r5ba653c rdf2be83  
    11## Define the appropriate configuration variables.
    22
    3 TeXLIB = .::
     3TeXLIB = .:../bibliography/:../LaTeXmacros/:
    44LaTeX  = TEXINPUTS=${TeXLIB} && export TEXINPUTS && latex
    5 BibTeX = BSTINPUTS=${TeXLIB} && export BSTINPUTS && bibtex
     5BibTeX = BIBINPUTS=${TeXLIB} && export BIBINPUTS && bibtex
    66
    77## Define the text source files.
     
    4343        dvips $< -o $@
    4444
    45 ${basename ${DOCUMENT}}.dvi : Makefile ${GRAPHS} ${PROGRAMS} ${PICTURES} ${FIGURES} ${SOURCES} ${basename ${DOCUMENT}}.tex ${basename ${DOCUMENT}}.bib /usr/local/bibliographies/pl.bib
     45${basename ${DOCUMENT}}.dvi : Makefile ${GRAPHS} ${PROGRAMS} ${PICTURES} ${FIGURES} ${SOURCES} ${basename ${DOCUMENT}}.tex \
     46                ../LaTeXmacros/common.tex ../LaTeXmacros/indexstyle ../bibliography/cfa.bib
    4647        # Conditionally create an empty *.ind (index) file for inclusion until makeindex is run.
    4748        if [ ! -r ${basename $@}.ind ] ; then touch ${basename $@}.ind ; fi
     
    5354        -${BibTeX} ${basename $@}
    5455        # Make index from *.aux entries and input index at end of document
    55         makeindex -s indexstyle ${basename $@}.idx
     56        makeindex -s ../LaTeXmacros/indexstyle ${basename $@}.idx
    5657        ${LaTeX} ${basename $@}.tex
    5758        # Run again to get index title into table of contents
  • doc/user/user.tex

    r5ba653c rdf2be83  
    1111%% Created On       : Wed Apr  6 14:53:29 2016
    1212%% Last Modified By : Peter A. Buhr
    13 %% Last Modified On : Wed Apr  6 17:37:39 2016
    14 %% Update Count     : 34
     13%% Last Modified On : Fri Apr  8 11:40:53 2016
     14%% Update Count     : 42
    1515%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    1616
     
    4343% Names used in the document.
    4444
    45 \newcommand{\CFA}{C$\mathbf\forall$\xspace}     % set language symbolic name
    46 \newcommand{\CFL}{Cforall\xspace}               % set language text name
    47 \newcommand{\CC}{C\kern-.1em\hbox{+\kern-.25em+}\xspace} % CC symbolic name
    48 \def\c11{ISO/IEC C} % C11 name (cannot have numbers in latex command name)
    4945\newcommand{\CS}{C\raisebox{-0.9ex}{\large$^\sharp$}\xspace}
    5046
     
    5248
    5349% Bespoke macros used in the document.
    54 
    55 \makeatletter
    56 % allow escape sequence in lstinline
    57 %\usepackage{etoolbox}
    58 %\patchcmd{\lsthk@TextStyle}{\let\lst@DefEsc\@empty}{}{}{\errmessage{failed to patch}}
    59 
    60 \renewcommand\small{%
    61    \@setfontsize\small{8.5}{11}%
    62    \abovedisplayskip 8.5pt \@plus 3pt \@minus 4pt
    63    \abovedisplayshortskip \z@ \@plus 2pt
    64    \belowdisplayshortskip 4pt \@plus 2pt \@minus 2pt
    65    \def\@listi{\leftmargin\leftmargini
    66                \topsep 4pt \@plus 2pt \@minus 2pt
    67                \parsep 2pt \@pluspt \@minuspt
    68                \itemsep \parsep}%
    69    \belowdisplayskip \abovedisplayskip
    70 }
    71 \usepackage{relsize}            % must be after change to small
    72 
    73 \renewcommand{\labelitemi}{{\raisebox{0.25ex}{\footnotesize$\bullet$}}}
    74 \renewenvironment{itemize}{\begin{list}{\labelitemi}{\topsep=5pt\itemsep=5pt\parsep=0pt}}{\end{list}}
    75 
    76 %  Reduce size of section titles
    77 \renewcommand\section{\@startsection{section}{1}{\z@}{-3.0ex \@plus -1ex \@minus -.2ex}{1.0ex \@plus .2ex}{\normalfont\large\bfseries}}
    78 \renewcommand\subsection{\@startsection{subsection}{2}{\z@}{-2.5ex \@plus -1ex \@minus -.2ex}{1.0ex \@plus .2ex}{\normalfont\normalsize\bfseries}}
    79 \renewcommand\subsubsection{\@startsection{subsubsection}{3}{\z@}{-2.5ex \@plus -1ex \@minus -.2ex}{1.0ex \@plus .2ex}{\normalfont\normalsize\bfseries}}
    80 \renewcommand\paragraph{\@startsection{paragraph}{4}{\z@}{-2.0ex \@plus -1ex \@minus -.2ex}{-1em}{\normalfont\normalsize\bfseries}}
    81 
    82 % index macros
    83 \newcommand{\italic}[1]{\emph{\hyperpage{#1}}}
    84 \newcommand{\definition}[1]{\textbf{\hyperpage{#1}}}
    85 \newcommand{\see}[1]{\emph{see} #1}
    86 
    87 % Define some commands that produce formatted index entries suitable for cross-references.
    88 % ``\spec'' produces entries for specifications of entities.  ``\impl'' produces entries for their
    89 % implementations, and ``\use'' for their uses.
    90 
    91 %  \newcommand{\bold}[1]{{\bf #1}}
    92 %  \def\spec{\@bsphack\begingroup
    93 %             \def\protect##1{\string##1\space}\@sanitize
    94 %             \@wrxref{|bold}}
    95 \def\impl{\@bsphack\begingroup
    96           \def\protect##1{\string##1\space}\@sanitize
    97           \@wrxref{|definition}}
    98 \newcommand{\indexcode}[1]{{\lstinline$#1$}}
    99 \def\use{\@bsphack\begingroup
    100          \def\protect##1{\string##1\space}\@sanitize
    101          \@wrxref{|hyperpage}}
    102 \def\@wrxref#1#2{\let\thepage\relax
    103     \xdef\@gtempa{\write\@indexfile{\string
    104     \indexentry{#2@{\lstinline$#2$}#1}{\thepage}}}\endgroup\@gtempa
    105     \if@nobreak \ifvmode\nobreak\fi\fi\@esphack}
    106 %\newcommand{\use}[1]{\index{#1@{\lstinline$#1$}}}
    107 %\newcommand{\impl}[1]{\index{\protect#1@{\lstinline$\protect#1$}|definition}}
    108 
    109 % inline text and lowercase index: \Index{inline and lowercase index text}
    110 % inline text and as-in index: \Index[as-is index text]{inline text}
    111 % inline text but index with different as-is text: \Index[index text]{inline text}
    112 \newcommand{\Index}{\@ifstar\@sIndex\@Index}
    113 \newcommand{\@Index}[2][\@empty]{\lowercase{\def\temp{#2}}#2\ifx#1\@empty\index{\temp}\else\index{#1@{\protect#2}}\fi}
    114 \newcommand{\@sIndex}[2][\@empty]{#2\ifx#1\@empty\index{#2}\else\index{#1@{\protect#2}}\fi}
    115 
    116 \newcommand{\newtermFontInline}{\emph}
    117 \newcommand{\newterm}{\@ifstar\@snewterm\@newterm}
    118 \newcommand{\@newterm}[2][\@empty]{\lowercase{\def\temp{#2}}{\newtermFontInline{#2}}\ifx#1\@empty\index{\temp}\else\index{#1@{\protect#2}}\fi}
    119 \newcommand{\@snewterm}[2][\@empty]{{\newtermFontInline{#2}}\ifx#1\@empty\index{#2}\else\index{#1@{\protect#2}}\fi}
    120 \makeatother
    121 
    122 % blocks and titles
    123 \newenvironment{quote2}{%
    124         \list{}{\lstset{resetmargins=true}\leftmargin=\parindent\rightmargin\leftmargin}%
    125         \item\relax
    126 }{%
    127         \endlist
    128 }% quote2
    129 \newenvironment{rationale}{%
    130   \begin{quotation}\noindent$\Box$\enspace
    131 }{%
    132   \hfill\enspace$\Box$\end{quotation}
    133 }%
    134 \newcommand{\define}[1]{\emph{#1\/}\index{#1}}
    135 \newcommand{\rewrite}{\(\Rightarrow\)}
    136 \newcommand{\rewriterules}{\paragraph{Rewrite Rules}~\par\noindent}
    137 \newcommand{\examples}{\paragraph{Examples}~\par\noindent}
    138 \newcommand{\semantics}{\paragraph{Semantics}~\par\noindent}
    139 \newcommand{\constraints}{\paragraph{Constraints}~\par\noindent}
    140 \newcommand{\predefined}{\paragraph{Predefined Identifiers}~\par\noindent}
    141 
    142 % BNF macros
    143 \def\syntax{\paragraph{Syntax}\trivlist\parindent=.5in\item[\hskip.5in]}
    144 \let\endsyntax=\endtrivlist
    145 \newcommand{\lhs}[1]{\par{\emph{#1:}}\index{#1@{\emph{#1}}|italic}}
    146 \newcommand{\rhs}{\hfil\break\hbox{\hskip1in}}
    147 \newcommand{\oldlhs}[1]{\emph{#1: \ldots}\index{#1@{\emph{#1}}|italic}}
    148 \newcommand{\nonterm}[1]{\emph{#1\/}\index{#1@{\emph{#1}}|italic}}
    149 \newcommand{\opt}{$_{opt}$\ }
    150 
    151 % adjust varioref package with default "section" and "page" titles, and optional title with faraway page numbers
    152 % \VRef{label} => Section 2.7, \VPageref{label} => page 17
    153 % \VRef[Figure]{label} => Figure 3.4, \VPageref{label} => page 17
    154 \renewcommand{\reftextfaceafter}{\unskip}
    155 \renewcommand{\reftextfacebefore}{\unskip}
    156 \renewcommand{\reftextafter}{\unskip}
    157 \renewcommand{\reftextbefore}{\unskip}
    158 \renewcommand{\reftextfaraway}[1]{\unskip, p.~\pageref{#1}}
    159 \renewcommand{\reftextpagerange}[2]{\unskip, pp.~\pageref{#1}--\pageref{#2}}
    160 \newcommand{\VRef}[2][Section]{\ifx#1\@empty\else{#1}\nobreakspace\fi\vref{#2}}
    161 \newcommand{\VPageref}[2][page]{\ifx#1\@empty\else{#1}\nobreakspace\fi\pageref{#2}}
    162 
    163 % Go programming language
    164 \lstdefinelanguage{Golang}%
    165   {morekeywords=[1]{package,import,func,type,struct,return,defer,panic, recover,select,var,const,iota,},%
    166    morekeywords=[2]{string,uint,uint8,uint16,uint32,uint64,int,int8,int16, int32,int64,
    167                 bool,float32,float64,complex64,complex128,byte,rune,uintptr, error,interface},%
    168    morekeywords=[3]{map,slice,make,new,nil,len,cap,copy,close,true,false, delete,append,real,imag,complex,chan,},%
    169    morekeywords=[4]{for,break,continue,range,goto,switch,case,fallthrough,if, else,default,},%
    170    morekeywords=[5]{Println,Printf,Error,},%
    171    sensitive=true,%
    172    morecomment=[l]{//},%
    173    morecomment=[s]{/*}{*/},%
    174    morestring=[b]',%
    175    morestring=[b]",%
    176    morestring=[s]{`}{`},%
    177 }
    178 
    179 % CFA based on ANSI C
    180 \lstdefinelanguage{CFA}[ANSI]{C}%
    181 {morekeywords={_Alignas,_Alignof,__alignof,__alignof__,asm,__asm,__asm__,_At,_Atomic,__attribute,__attribute__,auto,
    182     _Bool,catch,catchResume,choose,_Complex,__complex,__complex__,__const,__const__,disable,dtype,enable,__extension__,
    183         fallthru,finally,forall,ftype,_Generic,_Imaginary,inline,__label__,lvalue,_Noreturn,otype,restrict,_Static_assert,
    184         _Thread_local,throw,throwResume,trait,try,typeof,__typeof,__typeof__,},
    185   moredelim=**[is][\color{red}]{`}{`},
    186 }%
    187 
    188 \lstset{
    189 language=CFA,
    190 columns=flexible,
    191 basicstyle=\sf\relsize{-1},
    192 tabsize=4,
    193 xleftmargin=\parindent,
    194 escapechar=@,
    195 mathescape=true,
    196 keepspaces=true,
    197 showstringspaces=false,
    198 showlines=true,
    199 aboveskip=6pt,
    200 belowskip=4pt,
    201 literate={\\`}{\raisebox{0.3ex}{\ttfamily\upshape \hspace*{-2pt}`}}1, % escape \`, otherwise used to highlight in red
    202 %extendedchars=true,
    203 }%
    204 
    205 \makeatletter
    206 % replace/adjust listings characters that look bad in sanserif
    207 \lst@CCPutMacro
    208 \lst@ProcessOther{"22}{\lst@ttfamily{"}{\raisebox{0.3ex}{\ttfamily\upshape "}}} % replace double quote
    209 \lst@ProcessOther{"27}{\lst@ttfamily{'}{\raisebox{0.3ex}{\ttfamily\upshape '\hspace*{-2pt}}}} % replace single quote
    210 \lst@ProcessOther{"2D}{\lst@ttfamily{-}{\ttfamily\upshape -}} % replace minus
    211 \lst@ProcessOther{"3C}{\lst@ttfamily{<}{\texttt{<}}} % replace less than
    212 \lst@ProcessOther{"3E}{\lst@ttfamily{<}{\texttt{>}}} % replace greater than
    213 \lst@ProcessOther{"5E}{\raisebox{0.4ex}{$\scriptstyle\land\,$}} % replace circumflex
    214 \lst@ProcessOther{"5F}{\lst@ttfamily{\char95}{{\makebox[1.2ex][c]{\rule{1ex}{0.1ex}}}}} % replace underscore
    215 \lst@ProcessOther{"60}{\lst@ttfamily{`}{\raisebox{0.3ex}{\ttfamily\upshape \hspace*{-2pt}`}}} % replace backquote
    216 \lst@ProcessOther{"7E}{\raisebox{0.3ex}{$\scriptstyle\sim\,$}} % replace tilde
    217 %\lst@ProcessOther{"7E}{\raisebox{-.4ex}[1ex][0pt]{\textasciitilde}} % lower tilde
    218 \@empty\z@\@empty
    219 \makeatother
     50\input{common}
    22051
    22152\setcounter{secnumdepth}{3}     % number subsubsections
     
    45734404
    45744405
     4406\section{Rational Numbers}
     4407\label{s:RationalNumbers}
     4408
     4409Rational numbers are numbers written as a ratio, i.e., as a fraction, where the numerator (top number) and the denominator (bottom number) are whole numbers.
     4410When creating and computing with rational numbers, results are constantly reduced to keep the numerator and denominator as small as possible.
     4411
     4412\begin{lstlisting}
     4413// implementation
     4414struct Rational {
     4415        long int numerator, denominator;                                        // invariant: denominator > 0
     4416}; // Rational
     4417
     4418// constants
     4419extern struct Rational 0;
     4420extern struct Rational 1;
     4421
     4422// constructors
     4423Rational rational();
     4424Rational rational( long int n );
     4425Rational rational( long int n, long int d );
     4426
     4427// getter/setter for numerator/denominator
     4428long int numerator( Rational r );
     4429long int numerator( Rational r, long int n );
     4430long int denominator( Rational r );
     4431long int denominator( Rational r, long int d );
     4432
     4433// comparison
     4434int ?==?( Rational l, Rational r );
     4435int ?!=?( Rational l, Rational r );
     4436int ?<?( Rational l, Rational r );
     4437int ?<=?( Rational l, Rational r );
     4438int ?>?( Rational l, Rational r );
     4439int ?>=?( Rational l, Rational r );
     4440
     4441// arithmetic
     4442Rational -?( Rational r );
     4443Rational ?+?( Rational l, Rational r );
     4444Rational ?-?( Rational l, Rational r );
     4445Rational ?*?( Rational l, Rational r );
     4446Rational ?/?( Rational l, Rational r );
     4447
     4448// conversion
     4449double widen( Rational r );
     4450Rational narrow( double f, long int md );
     4451
     4452// I/O
     4453forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, Rational * );
     4454forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, Rational );
     4455\end{lstlisting}
     4456
     4457
    45754458\bibliographystyle{plain}
    4576 \bibliography{/usr/local/bibliographies/pl.bib}
     4459\bibliography{cfa}
    45774460
    45784461
  • src/Parser/ExpressionNode.cc

    r5ba653c rdf2be83  
    1010// Created On       : Sat May 16 13:17:07 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sun Mar 13 12:34:38 2016
    13 // Update Count     : 272
     12// Last Modified On : Fri Apr  8 15:43:05 2016
     13// Update Count     : 296
    1414//
    1515
     
    2222
    2323#include "ParseNode.h"
     24#include "TypeData.h"
    2425#include "SynTree/Constant.h"
    2526#include "SynTree/Expression.h"
     27#include "SynTree/Declaration.h"
    2628#include "Common/UnimplementedError.h"
    2729#include "parseutility.h"
     
    872874}
    873875
     876
     877CompoundLiteralNode::CompoundLiteralNode( DeclarationNode *type, InitializerNode *kids ) : type( type ), kids( kids ) {}
     878CompoundLiteralNode::CompoundLiteralNode( const CompoundLiteralNode &other ) : ExpressionNode( other ), type( other.type ), kids( other.kids ) {}
     879
     880CompoundLiteralNode::~CompoundLiteralNode() {
     881        delete kids;
     882        delete type;
     883}
     884
     885CompoundLiteralNode *CompoundLiteralNode::clone() const {
     886        return new CompoundLiteralNode( *this );
     887}
     888
     889void CompoundLiteralNode::print( std::ostream &os, int indent ) const {
     890        os << string( indent,' ' ) << "CompoundLiteralNode:" << endl;
     891
     892        os << string( indent + 2, ' ' ) << "type:" << endl;
     893        if ( type != 0 )
     894                type->print( os, indent + 4 );
     895
     896        os << string( indent + 2, ' ' ) << "initialization:" << endl;
     897        if ( kids != 0 )
     898                kids->printList( os, indent + 4 );
     899}
     900
     901void CompoundLiteralNode::printOneLine( std::ostream &os, int indent ) const {
     902        os << "( ";
     903        if ( type ) type->print( os );
     904        os << ", ";
     905        if ( kids ) kids->printOneLine( os );
     906        os << ") ";
     907}
     908
     909Expression *CompoundLiteralNode::build() const {
     910        Declaration * newDecl = type->build();                          // compound literal type
     911        if ( DeclarationWithType * newDeclWithType = dynamic_cast< DeclarationWithType * >( newDecl ) ) { // non-sue compound-literal type
     912                return new CompoundLiteralExpr( newDeclWithType->get_type(), kids->build() );
     913        // these types do not have associated type information
     914        } else if ( StructDecl * newDeclStructDecl = dynamic_cast< StructDecl * >( newDecl )  ) {
     915                return new CompoundLiteralExpr( new StructInstType( Type::Qualifiers(), newDeclStructDecl->get_name() ), kids->build() );
     916        } else if ( UnionDecl * newDeclUnionDecl = dynamic_cast< UnionDecl * >( newDecl )  ) {
     917                return new CompoundLiteralExpr( new UnionInstType( Type::Qualifiers(), newDeclUnionDecl->get_name() ), kids->build() );
     918        } else if ( EnumDecl * newDeclEnumDecl = dynamic_cast< EnumDecl * >( newDecl )  ) {
     919                return new CompoundLiteralExpr( new EnumInstType( Type::Qualifiers(), newDeclEnumDecl->get_name() ), kids->build() );
     920        } else {
     921                assert( false );
     922        } // if
     923}
     924
     925
    874926ExpressionNode *flattenCommas( ExpressionNode *list ) {
    875927        if ( CompositeExprNode *composite = dynamic_cast< CompositeExprNode * >( list ) ) {
  • src/Parser/ParseNode.h

    r5ba653c rdf2be83  
    1010// Created On       : Sat May 16 13:28:16 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Mar  2 17:26:35 2016
    13 // Update Count     : 190
     12// Last Modified On : Fri Apr  8 16:27:20 2016
     13// Update Count     : 205
    1414//
    1515
     
    538538};
    539539
     540class CompoundLiteralNode : public ExpressionNode {
     541  public:
     542        CompoundLiteralNode( DeclarationNode *type, InitializerNode *kids );
     543        CompoundLiteralNode( const CompoundLiteralNode &type );
     544        ~CompoundLiteralNode();
     545
     546        virtual CompoundLiteralNode *clone() const;
     547
     548        DeclarationNode *get_type() const { return type; }
     549        CompoundLiteralNode *set_type( DeclarationNode *t ) { type = t; return this; }
     550
     551        InitializerNode *get_initializer() const { return kids; }
     552        CompoundLiteralNode *set_initializer( InitializerNode *k ) { kids = k; return this; }
     553
     554        void print( std::ostream &, int indent = 0 ) const;
     555        void printOneLine( std::ostream &, int indent = 0 ) const;
     556
     557        virtual Expression *build() const;
     558  private:
     559        DeclarationNode *type;
     560        InitializerNode *kids;
     561};
     562
    540563template< typename SynTreeType, typename NodeType >
    541564void buildList( const NodeType *firstNode, std::list< SynTreeType *> &outputList ) {
  • src/Parser/parser.cc

    r5ba653c rdf2be83  
    51805180/* Line 1806 of yacc.c  */
    51815181#line 374 "parser.yy"
    5182     { (yyval.en) = 0; }
     5182    { (yyval.en) = new CompoundLiteralNode( (yyvsp[(2) - (7)].decl), new InitializerNode( (yyvsp[(5) - (7)].in), true ) ); }
    51835183    break;
    51845184
  • src/Parser/parser.yy

    r5ba653c rdf2be83  
    1010// Created On       : Sat Sep  1 20:22:55 2001
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Mar 24 16:16:16 2016
    13 // Update Count     : 1498
     12// Last Modified On : Fri Apr  8 16:21:55 2016
     13// Update Count     : 1508
    1414//
    1515
     
    372372                { $$ = new CompositeExprNode( new OperatorNode( OperatorNode::DecrPost ), $1 ); }
    373373        | '(' type_name_no_function ')' '{' initializer_list comma_opt '}' // C99
    374                 { $$ = 0; }
     374                { $$ = new CompoundLiteralNode( $2, new InitializerNode( $5, true ) ); }
    375375        | postfix_expression '{' argument_expression_list '}' // CFA
    376376                {
  • src/SymTab/AddVisit.h

    r5ba653c rdf2be83  
    99// Author           : Richard C. Bilson
    1010// Created On       : Sun May 17 16:14:32 2015
    11 // Last Modified By : Rob Schluntz
    12 // Last Modified On : Tue Jul 14 12:26:17 2015
    13 // Update Count     : 4
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Thu Apr  7 14:42:21 2016
     13// Update Count     : 5
    1414//
    1515
     
    2727
    2828        template< typename Visitor >
    29         inline void addVisitStatement( Statement *stmt, Visitor &visitor ) {
    30                 maybeAccept( stmt, visitor );
    31 ///   if ( ! declsToAdd.empty() ) {
    32 ///     CompoundStmt *compound = new CompoundStmt( noLabels );
    33 ///     compound->get_kids().push_back( stmt );
    34 ///     addDecls( declsToAdd, compound->get_kids(), compound->get_kids().end() );
    35 ///   }
    36         }
    37 
    38         template< typename Visitor >
    3929        inline void addVisit(CompoundStmt *compoundStmt, Visitor &visitor) {
    4030                addVisitStatementList( compoundStmt->get_kids(), visitor );
    41         }
    42 
    43         template< typename Visitor >
    44         inline void addVisit(IfStmt *ifStmt, Visitor &visitor) {
    45                 addVisitStatement( ifStmt->get_thenPart(), visitor );
    46                 addVisitStatement( ifStmt->get_elsePart(), visitor );
    47                 maybeAccept( ifStmt->get_condition(), visitor );
    48         }
    49 
    50         template< typename Visitor >
    51         inline void addVisit(WhileStmt *whileStmt, Visitor &visitor) {
    52                 addVisitStatement( whileStmt->get_body(), visitor );
    53                 maybeAccept( whileStmt->get_condition(), visitor );
    54         }
    55 
    56         template< typename Visitor >
    57         inline void addVisit(ForStmt *forStmt, Visitor &visitor) {
    58                 addVisitStatement( forStmt->get_body(), visitor );
    59                 acceptAll( forStmt->get_initialization(), visitor );
    60                 maybeAccept( forStmt->get_condition(), visitor );
    61                 maybeAccept( forStmt->get_increment(), visitor );
    6231        }
    6332
     
    7443        }
    7544
    76         template< typename Visitor >
    77         inline void addVisit(CaseStmt *caseStmt, Visitor &visitor) {
    78                 addVisitStatementList( caseStmt->get_statements(), visitor );
    79                 maybeAccept( caseStmt->get_condition(), visitor );
    80         }
    81 
    82         template< typename Visitor >
    83         inline void addVisit(CatchStmt *cathStmt, Visitor &visitor) {
    84                 addVisitStatement( cathStmt->get_body(), visitor );
    85                 maybeAccept( cathStmt->get_decl(), visitor );
    86         }
     45        // template< typename Visitor >
     46        // inline void addVisit(CaseStmt *caseStmt, Visitor &visitor) {
     47        //      addVisitStatementList( caseStmt->get_statements(), visitor );
     48        //      maybeAccept( caseStmt->get_condition(), visitor );
     49        // }
    8750} // namespace SymTab
    8851
  • src/SymTab/Validate.cc

    r5ba653c rdf2be83  
    1010// Created On       : Sun May 17 21:50:04 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Mar  2 17:31:39 2016
    13 // Update Count     : 226
     12// Last Modified On : Thu Apr  7 16:45:30 2016
     13// Update Count     : 243
    1414//
    1515
     
    4040#include <list>
    4141#include <iterator>
     42#include "Common/utility.h"
     43#include "Common/UniqueName.h"
    4244#include "Validate.h"
    4345#include "SynTree/Visitor.h"
    4446#include "SynTree/Mutator.h"
    4547#include "SynTree/Type.h"
     48#include "SynTree/Expression.h"
    4649#include "SynTree/Statement.h"
    4750#include "SynTree/TypeSubstitution.h"
     
    4952#include "FixFunction.h"
    5053// #include "ImplementationType.h"
    51 #include "Common/utility.h"
    52 #include "Common/UniqueName.h"
     54#include "GenPoly/DeclMutator.h"
    5355#include "AddVisit.h"
    5456#include "MakeLibCfa.h"
     
    7072
    7173                virtual void visit( CompoundStmt *compoundStmt );
    72                 virtual void visit( IfStmt *ifStmt );
    73                 virtual void visit( WhileStmt *whileStmt );
    74                 virtual void visit( ForStmt *forStmt );
    7574                virtual void visit( SwitchStmt *switchStmt );
    7675                virtual void visit( ChooseStmt *chooseStmt );
    77                 virtual void visit( CaseStmt *caseStmt );
    78                 virtual void visit( CatchStmt *catchStmt );
     76                // virtual void visit( CaseStmt *caseStmt );
    7977          private:
    8078                HoistStruct();
     
    144142
    145143                virtual void visit( CompoundStmt *compoundStmt );
    146                 virtual void visit( IfStmt *ifStmt );
    147                 virtual void visit( WhileStmt *whileStmt );
    148                 virtual void visit( ForStmt *forStmt );
    149144                virtual void visit( SwitchStmt *switchStmt );
    150145                virtual void visit( ChooseStmt *chooseStmt );
    151                 virtual void visit( CaseStmt *caseStmt );
    152                 virtual void visit( CatchStmt *catchStmt );
     146                // virtual void visit( CaseStmt *caseStmt );
    153147
    154148                AutogenerateRoutines() : functionNesting( 0 ) {}
     
    166160                /// and return something if the return type is non-void.
    167161                static void checkFunctionReturns( std::list< Declaration * > & translationUnit );
    168 
    169162          private:
    170163                virtual void visit( FunctionDecl * functionDecl );
     
    202195        };
    203196
     197        class CompoundLiteral : public GenPoly::DeclMutator {
     198                DeclarationNode::StorageClass storageclass = DeclarationNode::NoStorageClass;
     199
     200                virtual DeclarationWithType * mutate( ObjectDecl *objectDecl );
     201                virtual Expression *mutate( CompoundLiteralExpr *compLitExpr );
     202        };
     203
    204204        void validate( std::list< Declaration * > &translationUnit, bool doDebug ) {
    205205                Pass1 pass1;
    206206                Pass2 pass2( doDebug, 0 );
    207207                Pass3 pass3( 0 );
     208                CompoundLiteral compoundliteral;
     209
    208210                EliminateTypedef::eliminateTypedef( translationUnit );
    209211                HoistStruct::hoistStruct( translationUnit );
     
    211213                acceptAll( translationUnit, pass2 );
    212214                ReturnChecker::checkFunctionReturns( translationUnit );
     215                mutateAll( translationUnit, compoundliteral );
    213216                AutogenerateRoutines::autogenerateRoutines( translationUnit );
    214217                acceptAll( translationUnit, pass3 );
     
    292295        }
    293296
    294         void HoistStruct::visit( IfStmt *ifStmt ) {
    295                 addVisit( ifStmt, *this );
    296         }
    297 
    298         void HoistStruct::visit( WhileStmt *whileStmt ) {
    299                 addVisit( whileStmt, *this );
    300         }
    301 
    302         void HoistStruct::visit( ForStmt *forStmt ) {
    303                 addVisit( forStmt, *this );
    304         }
    305 
    306297        void HoistStruct::visit( SwitchStmt *switchStmt ) {
    307298                addVisit( switchStmt, *this );
     
    312303        }
    313304
    314         void HoistStruct::visit( CaseStmt *caseStmt ) {
    315                 addVisit( caseStmt, *this );
    316         }
    317 
    318         void HoistStruct::visit( CatchStmt *cathStmt ) {
    319                 addVisit( cathStmt, *this );
    320         }
     305        // void HoistStruct::visit( CaseStmt *caseStmt ) {
     306        //      addVisit( caseStmt, *this );
     307        // }
    321308
    322309        void Pass1::visit( EnumDecl *enumDecl ) {
     
    874861        }
    875862
    876         void AutogenerateRoutines::visit( IfStmt *ifStmt ) {
    877                 visitStatement( ifStmt );
    878         }
    879 
    880         void AutogenerateRoutines::visit( WhileStmt *whileStmt ) {
    881                 visitStatement( whileStmt );
    882         }
    883 
    884         void AutogenerateRoutines::visit( ForStmt *forStmt ) {
    885                 visitStatement( forStmt );
    886         }
    887 
    888863        void AutogenerateRoutines::visit( SwitchStmt *switchStmt ) {
    889864                visitStatement( switchStmt );
     
    894869        }
    895870
    896         void AutogenerateRoutines::visit( CaseStmt *caseStmt ) {
    897                 visitStatement( caseStmt );
    898         }
    899 
    900         void AutogenerateRoutines::visit( CatchStmt *cathStmt ) {
    901                 visitStatement( cathStmt );
    902         }
     871        // void AutogenerateRoutines::visit( CaseStmt *caseStmt ) {
     872        //      visitStatement( caseStmt );
     873        // }
    903874
    904875        void ReturnChecker::checkFunctionReturns( std::list< Declaration * > & translationUnit ) {
     
    10801051        }
    10811052
     1053        DeclarationWithType * CompoundLiteral::mutate( ObjectDecl *objectDecl ) {
     1054                storageclass = objectDecl->get_storageClass();
     1055                DeclarationWithType * temp = Mutator::mutate( objectDecl );
     1056                storageclass = DeclarationNode::NoStorageClass;
     1057                return temp;
     1058        }
     1059
     1060        Expression *CompoundLiteral::mutate( CompoundLiteralExpr *compLitExpr ) {
     1061                // transform [storage_class] ... (struct S){ 3, ... };
     1062                // into [storage_class] struct S temp =  { 3, ... };
     1063                static UniqueName indexName( "_compLit" );
     1064
     1065                ObjectDecl *tempvar = new ObjectDecl( indexName.newName(), storageclass, LinkageSpec::C, 0, compLitExpr->get_type(), compLitExpr->get_initializer() );
     1066                compLitExpr->set_type( 0 );
     1067                compLitExpr->set_initializer( 0 );
     1068                delete compLitExpr;
     1069                DeclarationWithType * newtempvar = mutate( tempvar );
     1070                addDeclaration( newtempvar );                                   // add modified temporary to current block
     1071                return new VariableExpr( newtempvar );
     1072        }
    10821073} // namespace SymTab
    10831074
  • src/SynTree/Expression.cc

    r5ba653c rdf2be83  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Rob Schluntz
    12 // Last Modified On : Wed Dec 09 14:10:29 2015
    13 // Update Count     : 34
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Fri Apr  8 17:16:23 2016
     13// Update Count     : 40
    1414//
    1515
     
    2222
    2323#include "Type.h"
     24#include "Initializer.h"
    2425#include "Expression.h"
    2526#include "Declaration.h"
     
    464465
    465466
     467CompoundLiteralExpr::CompoundLiteralExpr( Type * type, Initializer * initializer ) : type( type ), initializer( initializer ) {
     468        add_result( type->clone() );
     469}
     470
     471CompoundLiteralExpr::CompoundLiteralExpr( const CompoundLiteralExpr &other ) : Expression( other ), type( maybeClone( other.type ) ), initializer( maybeClone( other.initializer ) ) {}
     472
     473CompoundLiteralExpr::~CompoundLiteralExpr() {
     474        delete initializer;
     475        delete type;
     476}
     477
     478void CompoundLiteralExpr::print( std::ostream &os, int indent ) const {
     479        os << "Compound Literal Expression: " << std::endl;
     480        if ( type ) type->print( os, indent + 2 );
     481        if ( initializer ) initializer->print( os, indent + 2 );
     482}
     483
    466484
    467485std::ostream & operator<<( std::ostream & out, Expression * expr ) {
  • src/SynTree/Expression.h

    r5ba653c rdf2be83  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Rob Schluntz
    12 // Last Modified On : Wed Dec 09 14:10:21 2015
    13 // Update Count     : 19
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Fri Apr  8 17:18:06 2016
     13// Update Count     : 21
    1414//
    1515
     
    577577};
    578578
     579/// CompoundLiteralExpr represents a C99 'compound literal'
     580class CompoundLiteralExpr : public Expression {
     581  public:
     582        CompoundLiteralExpr( Type * type, Initializer * initializer );
     583        CompoundLiteralExpr( const CompoundLiteralExpr &other );
     584        ~CompoundLiteralExpr();
     585
     586        Type * get_type() const { return type; }
     587        void set_type( Type * t ) { type = t; }
     588
     589        Initializer * get_initializer() const { return initializer; }
     590        void set_initializer( Initializer * i ) { initializer = i; }
     591
     592        virtual CompoundLiteralExpr *clone() const { return new CompoundLiteralExpr( *this ); }
     593        virtual void accept( Visitor &v ) { v.visit( this ); }
     594        virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); }
     595        virtual void print( std::ostream &os, int indent = 0 ) const;
     596  private:
     597        Type * type;
     598        Initializer * initializer;
     599};
     600
    579601std::ostream & operator<<( std::ostream & out, Expression * expr );
    580602
  • src/SynTree/Mutator.cc

    r5ba653c rdf2be83  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Mar  2 17:28:20 2016
    13 // Update Count     : 12
     12// Last Modified On : Fri Apr  1 18:05:16 2016
     13// Update Count     : 16
    1414//
    1515
     
    342342}
    343343
     344Expression *Mutator::mutate( CompoundLiteralExpr *compLitExpr ) {
     345        mutateAll( compLitExpr->get_results(), *this );
     346        compLitExpr->set_type( maybeMutate( compLitExpr->get_type(), *this ) );
     347        compLitExpr->set_initializer( maybeMutate( compLitExpr->get_initializer(), *this ) );
     348        return compLitExpr;
     349}
     350
    344351Type *Mutator::mutate( VoidType *voidType ) {
    345352        mutateAll( voidType->get_forall(), *this );
  • src/SynTree/Mutator.h

    r5ba653c rdf2be83  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Mar  2 17:33:11 2016
    13 // Update Count     : 9
     12// Last Modified On : Fri Apr  1 17:26:56 2016
     13// Update Count     : 10
    1414//
    1515#include <cassert>
     
    7777        virtual Expression* mutate( AsmExpr *asmExpr );
    7878        virtual Expression* mutate( UntypedValofExpr *valofExpr );
     79        virtual Expression* mutate( CompoundLiteralExpr *compLitExpr );
    7980
    8081        virtual Type* mutate( VoidType *basicType );
  • src/SynTree/SynTree.h

    r5ba653c rdf2be83  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Mar  2 17:29:00 2016
    13 // Update Count     : 4
     12// Last Modified On : Fri Apr  1 16:47:44 2016
     13// Update Count     : 5
    1414//
    1515
     
    8282class AsmExpr;
    8383class UntypedValofExpr;
     84class CompoundLiteralExpr;
    8485
    8586class Type;
  • src/SynTree/Visitor.cc

    r5ba653c rdf2be83  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Mar  2 17:29:23 2016
    13 // Update Count     : 16
     12// Last Modified On : Fri Apr  1 18:05:13 2016
     13// Update Count     : 18
    1414//
    1515
     
    289289}
    290290
     291void Visitor::visit( CompoundLiteralExpr *compLitExpr ) {
     292        acceptAll( compLitExpr->get_results(), *this );
     293        maybeAccept( compLitExpr->get_type(), *this );
     294        maybeAccept( compLitExpr->get_initializer(), *this );
     295}
     296
    291297void Visitor::visit( VoidType *voidType ) {
    292298        acceptAll( voidType->get_forall(), *this );
  • src/SynTree/Visitor.h

    r5ba653c rdf2be83  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Mar  2 17:33:35 2016
    13 // Update Count     : 6
     12// Last Modified On : Fri Apr  1 17:26:55 2016
     13// Update Count     : 7
    1414//
    1515
     
    7777        virtual void visit( AsmExpr *asmExpr );
    7878        virtual void visit( UntypedValofExpr *valofExpr );
     79        virtual void visit( CompoundLiteralExpr *compLitExpr );
    7980
    8081        virtual void visit( VoidType *basicType );
  • src/examples/rational.c

    r5ba653c rdf2be83  
    66// file "LICENCE" distributed with Cforall.
    77//
    8 // rational.c --
     8// rational.c -- test rational number package
    99//
    1010// Author           : Peter A. Buhr
    1111// Created On       : Mon Mar 28 08:43:12 2016
    1212// Last Modified By : Peter A. Buhr
    13 // Last Modified On : Thu Apr  7 17:25:44 2016
    14 // Update Count     : 20
     13// Last Modified On : Fri Apr  8 11:27:48 2016
     14// Update Count     : 21
    1515//
    1616
  • src/libcfa/rational

    r5ba653c rdf2be83  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // rational --
     7// rational -- Rational numbers are numbers written as a ratio, i.e., as a fraction, where the numerator (top number)
     8//     and the denominator (bottom number) are whole numbers. When creating and computing with rational numbers, results
     9//     are constantly reduced to keep the numerator and denominator as small as possible.
    810//
    911// Author           : Peter A. Buhr
    1012// Created On       : Wed Apr  6 17:56:25 2016
    1113// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Apr  7 17:23:36 2016
    13 // Update Count     : 9
     14// Last Modified On : Fri Apr  8 11:38:27 2016
     15// Update Count     : 15
    1416//
    1517
    1618#include "iostream"
    1719
     20// implementation
    1821struct Rational {
    1922        long int numerator, denominator;                                        // invariant: denominator > 0
    2023}; // Rational
    2124
     25// constants
    2226extern struct Rational 0;
    2327extern struct Rational 1;
    2428
    25 long int gcd( long int a, long int b );
    26 long int simplify( long int *n, long int *d );
    27 Rational rational();                                                                    // constructor
    28 Rational rational( long int n );                                                // constructor
    29 Rational rational( long int n, long int d );                    // constructor
     29// constructors
     30Rational rational();
     31Rational rational( long int n );
     32Rational rational( long int n, long int d );
     33
     34// getter/setter for numerator/denominator
    3035long int numerator( Rational r );
    3136long int numerator( Rational r, long int n );
     37long int denominator( Rational r );
    3238long int denominator( Rational r, long int d );
     39
     40// comparison
    3341int ?==?( Rational l, Rational r );
    3442int ?!=?( Rational l, Rational r );
     
    3745int ?>?( Rational l, Rational r );
    3846int ?>=?( Rational l, Rational r );
     47
     48// arithmetic
    3949Rational -?( Rational r );
    4050Rational ?+?( Rational l, Rational r );
     
    4252Rational ?*?( Rational l, Rational r );
    4353Rational ?/?( Rational l, Rational r );
     54
     55// conversion
    4456double widen( Rational r );
    4557Rational narrow( double f, long int md );
     58
     59// I/O
    4660forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, Rational * );
    4761forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, Rational );
  • src/libcfa/rational.c

    r5ba653c rdf2be83  
    1111// Created On       : Wed Apr  6 17:54:28 2016
    1212// Last Modified By : Peter A. Buhr
    13 // Last Modified On : Thu Apr  7 17:28:03 2016
    14 // Update Count     : 12
     13// Last Modified On : Fri Apr  8 17:35:05 2016
     14// Update Count     : 18
    1515//
    1616
     
    2323} // extern
    2424
     25
     26// constants
     27
    2528struct Rational 0 = {0, 1};
    2629struct Rational 1 = {1, 1};
    2730
    28 // Calculate the greatest common denominator of two numbers, the first of which may be negative.  It is used to reduce
    29 // rationals.
    30 
    31 long int gcd( long int a, long int b ) {
     31
     32// helper
     33
     34// Calculate greatest common denominator of two numbers, the first of which may be negative. Used to reduce rationals.
     35static long int gcd( long int a, long int b ) {
    3236    for ( ;; ) {                                                                                // Euclid's algorithm
    3337                long int r = a % b;
     
    3943} // gcd
    4044
    41 long int simplify( long int *n, long int *d ) {
     45static long int simplify( long int *n, long int *d ) {
    4246    if ( *d == 0 ) {
    4347                serr | "Invalid rational number construction: denominator cannot be equal to 0." | endl;
     
    4852} // Rationalnumber::simplify
    4953
    50 Rational rational() {                                                                   // constructor
    51 //    r = (Rational){ 0, 1 };
    52         Rational t = { 0, 1 };
    53         return t;
     54
     55// constructors
     56
     57Rational rational() {
     58    return (Rational){ 0, 1 };
    5459} // rational
    5560
    56 Rational rational( long int n ) {                                               // constructor
    57 //    r = (Rational){ n, 1 };
    58         Rational t = { n, 1 };
    59         return t;
     61Rational rational( long int n ) {
     62    return (Rational){ n, 1 };
    6063} // rational
    6164
    62 Rational rational( long int n, long int d ) {                   // constructor
     65Rational rational( long int n, long int d ) {
    6366    long int t = simplify( &n, &d );                                    // simplify
    64 //    r = (Rational){ n / t, d / t };
    65         Rational t = { n / t, d / t };
    66         return t;
     67    return (Rational){ n / t, d / t };
    6768} // rational
     69
     70
     71// getter/setter for numerator/denominator
    6872
    6973long int numerator( Rational r ) {
     
    7983} // numerator
    8084
     85long int denominator( Rational r ) {
     86    return r.denominator;
     87} // denominator
     88
    8189long int denominator( Rational r, long int d ) {
    8290    long int prev = r.denominator;
     
    8795} // denominator
    8896
     97
     98// comparison
     99
    89100int ?==?( Rational l, Rational r ) {
    90101    return l.numerator * r.denominator == l.denominator * r.numerator;
     
    110121    return ! ( l < r );
    111122} // ?>=?
     123
     124
     125// arithmetic
    112126
    113127Rational -?( Rational r ) {
     
    149163    return t;
    150164} // ?/?
     165
     166
     167// conversion
    151168
    152169double widen( Rational r ) {
     
    188205} // narrow
    189206
     207
     208// I/O
     209
    190210forall( dtype istype | istream( istype ) )
    191211istype * ?|?( istype *is, Rational *r ) {
Note: See TracChangeset for help on using the changeset viewer.