Bläddra i källkod

macro-izing more grammars

Jeremy Siek 3 år sedan
förälder
incheckning
4f19bf27a1
1 ändrade filer med 85 tillägg och 57 borttagningar
  1. 85 57
      book.tex

+ 85 - 57
book.tex

@@ -2317,12 +2317,8 @@ integer constant (called an \emph{immediate value}\index{subject}{immediate
               \MID \key{r11} \MID \key{r12} \MID \key{r13}
               \MID \key{r14} \MID \key{r15}}
 
-\begin{figure}[tp]
-\fbox{
-\begin{minipage}{0.96\textwidth}
-{\if\edition\racketEd    
-\[
-\begin{array}{lcl}
+\newcommand{\GrammarXInt}{
+\begin{array}{rcl}
 \Reg &::=& \allregisters{} \\
 \Arg &::=&  \key{\$}\Int \MID \key{\%}\Reg \MID \Int\key{(}\key{\%}\Reg\key{)}\\
 \Instr &::=& \key{addq} \; \Arg\key{,} \Arg \MID
@@ -2332,10 +2328,22 @@ integer constant (called an \emph{immediate value}\index{subject}{immediate
       \key{callq} \; \mathit{label} \MID
       \key{retq} \MID
       \key{jmp}\,\itm{label} \MID \\
-  && \itm{label}\key{:}\; \Instr \\
+  && \itm{label}\key{:}\; \Instr 
+\end{array}
+}
+
+\begin{figure}[tp]
+\fbox{
+\begin{minipage}{0.96\textwidth}
+{\if\edition\racketEd    
+\[
+\begin{array}{l}
+  \GrammarXInt \\
+\begin{array}{lcl}
 \LangXIntM{} &::= & \key{.globl main}\\
       &    & \key{main:} \; \Instr\ldots
 \end{array}
+\end{array}
 \]
 \fi}
 {\if\edition\pythonEd
@@ -2600,12 +2608,8 @@ register allocation (Chapter~\ref{ch:register-allocation-Lvar}).
               \MID \skey{r11} \MID \skey{r12} \MID \skey{r13}
               \MID \skey{r14} \MID \skey{r15}}
 
-\begin{figure}[tp]
-\fbox{
-\begin{minipage}{0.98\textwidth}
-\small
-{\if\edition\racketEd    
-\[
+
+\newcommand{\ASTXIntRacket}{
 \begin{array}{lcl}
 \Reg &::=& \allregisters{} \\
 \Arg &::=&  \IMM{\Int} \MID \REG{\Reg}
@@ -2618,9 +2622,22 @@ register allocation (Chapter~\ref{ch:register-allocation-Lvar}).
       &\MID& \CALLQ{\itm{label}}{\itm{int}}
        \MID \RETQ{}
        \MID \JMP{\itm{label}}  \\
-\Block &::= & \BLOCK{\itm{info}}{\LP\Instr\ldots\RP} \\
+\Block &::= & \BLOCK{\itm{info}}{\LP\Instr\ldots\RP} 
+\end{array}
+}
+
+\begin{figure}[tp]
+\fbox{
+\begin{minipage}{0.98\textwidth}
+\small
+{\if\edition\racketEd    
+\[
+\begin{array}{l}
+  \ASTXIntRacket \\
+\begin{array}{lcl}
 \LangXIntM{} &::= & \XPROGRAM{\itm{info}}{\LP\LP\itm{label} \,\key{.}\, \Block \RP\ldots\RP}
 \end{array}
+\end{array}
 \]
 \fi}
 {\if\edition\pythonEd
@@ -7381,7 +7398,8 @@ in Figure~\ref{fig:c1-syntax}.
 \fi}
 \end{minipage}
 }
-\caption{The concrete syntax of the \LangCIf{} intermediate language.}
+\caption{The concrete syntax of the \LangCIf{} intermediate language,
+  an extension of \LangCVar{} (Figure~\ref{fig:c0-concrete-syntax}).}
 \label{fig:c1-concrete-syntax}
 \end{figure}
 
@@ -7457,30 +7475,32 @@ $\Atm$.
 \end{array}
 \]
 
-
-\begin{figure}[tp]
-\fbox{
-\begin{minipage}{0.96\textwidth}
-\[
+\newcommand{\GrammarXIf}{
 \begin{array}{lcl}
   \itm{bytereg} &::=& \key{ah} \MID \key{al} \MID \key{bh} \MID \key{bl}
     \MID \key{ch} \MID \key{cl} \MID \key{dh} \MID \key{dl} \\
-\Arg &::=& \gray{ \key{\$}\Int \MID \key{\%}\Reg \MID \Int\key{(}\key{\%}\Reg\key{)} } \MID \key{\%}\itm{bytereg}\\
+\Arg &::=& \key{\%}\itm{bytereg}\\
 \itm{cc} & ::= & \key{e} \MID \key{ne} \MID \key{l} \MID \key{le} \MID \key{g} \MID \key{ge} \\
-\Instr &::=& \gray{ \key{addq} \; \Arg\key{,} \Arg \MID
-      \key{subq} \; \Arg\key{,} \Arg \MID
-      \key{negq} \; \Arg \MID \key{movq} \; \Arg\key{,} \Arg \MID } \\
-  &&  \gray{ \key{callq} \; \itm{label} \MID
-      \key{pushq}\;\Arg \MID \key{popq}\;\Arg \MID \key{retq} \MID \racket{\key{jmp}\,\itm{label} \MID} } \python{\key{jmp}\,\itm{label} \MID}  \\
-  && \racket{\gray{ \itm{label}\key{:}\; \Instr }}\python{\itm{label}\key{:}\; \Instr}
-     \MID \key{xorq}~\Arg\key{,}~\Arg
+\Instr &::=& \key{xorq}~\Arg\key{,}~\Arg
      \MID \key{cmpq}~\Arg\key{,}~\Arg  \MID \\
   &&  \key{set}cc~\Arg
      \MID \key{movzbq}~\Arg\key{,}~\Arg
      \MID \key{j}cc~\itm{label}
-     \\
-\LangXIfM{} &::= & \gray{ \key{.globl main} }\\
-      &    & \gray{ \key{main:} \; \Instr\ldots }
+\end{array}
+}
+
+
+\begin{figure}[tp]
+\fbox{
+\begin{minipage}{0.96\textwidth}
+\[
+\begin{array}{l}
+  \gray{\GrammarXInt} \\ \hline
+  \GrammarXIf \\ 
+\begin{array}{lcl}
+\LangXIfM{} &::= &  \key{.globl main} \\
+      &    & \key{main:} \; \Instr\ldots 
+\end{array}
 \end{array}
 \]
 \end{minipage}
@@ -7489,31 +7509,32 @@ $\Atm$.
 \label{fig:x86-1-concrete}
 \end{figure}
 
-\begin{figure}[tp]
-\fbox{
-\begin{minipage}{0.98\textwidth}
-\small    
-{\if\edition\racketEd    
-\[
+\newcommand{\ASTXIfRacket}{
 \begin{array}{lcl}
 \itm{bytereg} &::=& \key{ah} \MID \key{al} \MID \key{bh} \MID \key{bl}
     \MID \key{ch} \MID \key{cl} \MID \key{dh} \MID \key{dl} \\
-\Arg &::=&  \gray{\IMM{\Int} \MID \REG{\Reg} \MID \DEREF{\Reg}{\Int}} 
-     \MID \BYTEREG{\itm{bytereg}} \\
+\Arg &::=&  \BYTEREG{\itm{bytereg}} \\
 \itm{cc} & ::= & \key{e} \MID \key{l} \MID \key{le} \MID \key{g} \MID \key{ge} \\
-\Instr &::=& \gray{ \BININSTR{\code{addq}}{\Arg}{\Arg} 
-       \MID \BININSTR{\code{subq}}{\Arg}{\Arg} } \\
-       &\MID& \gray{ \BININSTR{\code{'movq}}{\Arg}{\Arg} 
-       \MID \UNIINSTR{\code{negq}}{\Arg} } \\
-       &\MID& \gray{ \CALLQ{\itm{label}}{\itm{int}} \MID \RETQ{}  }\\
-       &\MID& \gray{ \PUSHQ{\Arg} \MID \POPQ{\Arg} \MID \JMP{\itm{label}} } \\
-       &\MID& \BININSTR{\code{xorq}}{\Arg}{\Arg}
+\Instr &::=& \BININSTR{\code{xorq}}{\Arg}{\Arg}
        \MID \BININSTR{\code{cmpq}}{\Arg}{\Arg}\\
        &\MID& \BININSTR{\code{set}}{\itm{cc}}{\Arg} 
        \MID \BININSTR{\code{movzbq}}{\Arg}{\Arg}\\
-       &\MID&  \JMPIF{'\itm{cc}'}{\itm{label}} \\
-\Block &::= & \gray{\BLOCK{\itm{info}}{\LP\Instr\ldots\RP}} \\
-\LangXIfM{} &::= & \gray{\XPROGRAM{\itm{info}}{\LP\LP\itm{label} \,\key{.}\, \Block \RP\ldots\RP}}
+       &\MID&  \JMPIF{'\itm{cc}'}{\itm{label}} 
+\end{array}
+}
+
+  \begin{figure}[tp]
+\fbox{
+\begin{minipage}{0.98\textwidth}
+\small    
+{\if\edition\racketEd    
+\[
+\begin{array}{l}
+  \gray{\ASTXIntRacket} \\ \hline
+  \ASTXIfRacket \\
+\begin{array}{lcl}
+\LangXIfM{} &::= & \XPROGRAM{\itm{info}}{\LP\LP\itm{label} \,\key{.}\, \Block \RP\ldots\RP}
+\end{array}
 \end{array}
 \]
 \fi}
@@ -7708,7 +7729,15 @@ particularly important to \textbf{not} replace its condition with a
 temporary variable because that would interfere with the generation of
 high-quality output in the \code{explicate\_control} pass.
 
-
+\newcommand{\LifMonadASTRacket}{
+\begin{array}{rcl}
+\Atm &::=& \BOOL{\itm{bool}}\\
+\Exp &::=& \UNIOP{\key{not}}{\Atm} 
+     \MID \BINOP{\itm{cmp}}{\Atm}{\Atm} 
+     \MID \IF{\Exp}{\Exp}{\Exp} 
+\end{array}
+}
+  
 \newcommand{\LifMonadASTPython}{
 \begin{array}{rcl}
 %% \itm{binaryop} &::=& \code{Add()} \MID \code{Sub()} \\
@@ -7728,15 +7757,13 @@ high-quality output in the \code{explicate\_control} pass.
 \begin{minipage}{0.96\textwidth}
 {\if\edition\racketEd    
 \[
+\begin{array}{l}
+  \gray{\LvarMonadASTRacket} \\ \hline
+  \LifMonadASTRacket \\
 \begin{array}{rcl}
-Atm &::=& \gray{ \INT{\Int} \MID \VAR{\Var} } \MID \BOOL{\itm{bool}}\\
-\Exp &::=& \gray{ \Atm \MID \READ{} } \\
-     &\MID& \gray{ \NEG{\Atm} \MID \ADD{\Atm}{\Atm} } \\
-     &\MID& \gray{ \LET{\Var}{\Exp}{\Exp} } \\
-     &\MID& \UNIOP{\key{not}}{\Atm} \\
-      &\MID& \BINOP{\itm{cmp}}{\Atm}{\Atm} \MID \IF{\Exp}{\Exp}{\Exp} \\
 \LangIfANF  &::=& \PROGRAM{\code{()}}{\Exp}
 \end{array}
+\end{array}
 \]
 \fi}
 {\if\edition\pythonEd
@@ -7752,7 +7779,8 @@ Atm &::=& \gray{ \INT{\Int} \MID \VAR{\Var} } \MID \BOOL{\itm{bool}}\\
 \fi}
 \end{minipage}
 }
-\caption{\LangIfANF{} is \LangIf{} in monadic normal form.}
+\caption{\LangIfANF{} is \LangIf{} in monadic normal form
+  (extends \LangVarANF in Figure~\ref{fig:Lvar-anf-syntax}).}
 \label{fig:Lif-anf-syntax}
 \end{figure}