答案1
这实际上不是初学者的任务。无论如何,我认为这是学习 LaTeX 的好机会。
- 在确定最常用的构造并按种类划分它们之后,为各个子任务定义命令;
- 查看表格布局:我们在“原始语言语法”部分识别出三列(r,c 和 l);
- 以一致的方式添加项目。
我所认识的结构是“元变量”、“键”(细分为单词、运算符、二元运算、关系和标点符号)。在最后一列中,我们可以看到尖括号中的结构;分数类对象已用带array
实线或点分隔符的 来处理。
最后,对于少数需要拆线的情况,我定义了一个特别指定 \dbl
命令。在一些情况下,需要人工干预。
\documentclass{article}
\usepackage{amsmath,mathtools,amssymb,array,arydshln}
\newcommand{\meta}[1]{\mathit{#1}}
\newcommand{\kword}[1]{\mathtt{#1}}
\newcommand{\kop}[1]{\mathop{{}\texttt{#1}}}
\newcommand{\kbin}[1]{\mathbin{\texttt{#1}}}
\newcommand{\krel}[1]{\mathrel{\texttt{#1}}}
\newcommand{\kpun}[1]{\mathpunct{\texttt{#1}}}
\newcommand{\str}[1]{[\textit{#1}]}
\newcommand{\sem}[2]{\langle #1\rangle_{\mathsf{#2}}}
\newcommand{\sop}[2]{#1_{\mathit{#2}}}
\newcommand{\Ceq}{\Coloneqq}
\newcommand{\dbl}[1]{\begin{array}[t]{@{}l@{}}#1\end{array}}
\newcommand{\subexp}[2]{\begin{array}[t]{@{}c@{}}#1\\\hline#2\end{array}}
\newcommand{\sv}{\subexp{\mbox{\enspace}}{\mbox{\enspace}}}
\newcommand{\dsubexp}[2]{%
\begin{array}[t]{@{}c@{}}#1\\\cdashline{1-1}[.4pt/1pt]#2\end{array}%
}
\begin{document}
\begin{tabular}{
|
>{$}r<{$}
@{}
>{${}}c<{{}$}
@{}
>{$}l<{$}
|
l
|
>{$}l<{$}
|
}
\hline
\multicolumn{3}{|c|}{Original language syntax} &
\multicolumn{1}{c|}{Strictness} &
\multicolumn{1}{c|}{Semantics} \\
\hline
\meta{AExp}
& \Ceq & \meta{Int}\mid \meta{Id} &
&
\sem{\subexp{x}{i}\quad \sv}{k} \quad \sem{\sv\quad x\mapsto i\quad \sv}{state} \\
& \mid & \meta{AExp}\kbin{+}\meta{AExp} &
\str{strict} &
i_1\kbin{+}i_2 \to i_1 \sop{+}{Int} i_2 \\
& \mid & \meta{AExp}\kbin{/}\meta{AExp} &
\str{strict} &
i_1\kbin{/}i_2 \to i_1 \sop{/\!}{Int} i_2 \qquad \text{when $i_2\ne0$} \\
\meta{BExp}
& \Ceq & \meta{AExp}\krel{<=}\meta{AExp} &
\str{seqstrict} &
i_1\krel{<=}i_2 \to i_1 \sop{\le}{Int} i_2 \\
& \mid & \kop{not}\meta{BExp} &
\str{strict} &
\kop{not} t \to \sop{\lnot}{Bool} t \\
& \mid & \meta{BExp}\krel{and}\meta{BExp} &
\str{strict\textup{(1)}} &
\dbl{
\meta{true}\krel{and} b \to b \\
\meta{false}\krel{and} b \to \kword{false}
} \\
\meta{Stmt}
& \Ceq & \kword{skip}\kpun{;} &
&
\kword{skip}\kpun{;} \to {\cdot} \\
& \mid & \meta{Id}\krel{=}\meta{AExp}\kpun{;} &
\str{strict\textup{(2)}} &
\sem{\subexp{x\krel{=}i\kpun{;}}{\cdot}\quad \sv}{k}
\quad \sem{\sv\quad x\mapsto \subexp{{\!\underline{\quad }\!}}{\,i\,}\quad \sv}{state} \\
& \mid & \meta{Stmt}\quad \meta{Stmt} &
&
s_1\quad s_2 \rightharpoonup s_1 \curvearrowright s_2 \\
& \mid & \krel{if}\meta{BExp}\;\dbl{\krel{then}\meta{Stmt}\\\krel{else}\meta{Stmt}} &
\str{strict\textup{(1)}} &
\dbl{
\krel{if}\meta{true}\krel{then} s \krel{else} \_ \to s \\
\krel{if}\meta{false}\krel{then} \_ \krel{else} s \to s
} \\
& \mid & \krel{while}\meta{BExp}\krel{then}\meta{Stmt} &
&
\sem{
\dsubexp
{\krel{while} b \krel{do} s}
{\krel{if} b \krel{then} (s\krel{while} b \krel{do} s)
\krel{else}\kword{skip}\kpun{;}}
\quad \sv}{k} \\
\meta{Pgm}
& \Ceq & \kop{var}\mathsf{List}[\meta{Id}]\kpun{;}\quad \meta{Stmt} &
&
\sem{\dsubexp{\kop{var}xl\kpun{;}\quad s}{s}}{k}
\quad \sem{\dsubexp{\cdot}{xl\mapsto 0}}{state} \\
\hline
\end{tabular}
\end{document}