上下文无关语法生成与对齐

上下文无关语法生成与对齐

我正在尝试为文档编写语法生成。我正在使用对齐环境来获取所需的语法生成,如下所示:

\begin{align*} 
S\# &\rightarrow aA | bA\\ 
A\# &\rightarrow aA | bA\\
\# A &\rightarrow Aa | Ab \\
{A \above 0pt \#} &\rightarrow {a \above 0pt A} \mid {b \above 0pt A} \\
A &\rightarrow a | b
\end{align*}

但是 1. 有没有更好的方法可以做到这一点?
2. 我该怎么做才能得到符号一个在另一个符号上方的语法作品?目前我使用 ${a \above b}$ 来实现这一点。有没有更好的方法可以做到这一点?
3. 我需要附图中提到的形式的作品,其中一组作品与另一组作品相邻。如何在 中生成这样的语法作品\LaTeX

请帮忙。我找不到与此问题相关的帖子。谢谢

在此处输入图片描述

答案1

我并不认为这是最好的方法,但过去我排版 CFG 时,我倾向于使用\to并定义\OR分隔符的宏。我还用一个使用from 的\above新宏替换了您的宏。\stack\genfracamsmath

\documentclass{article}
\usepackage{amsmath}

\newcommand*\OR{\ |\ }
\newcommand*\stack[2]{\genfrac{}{}{0pt}{0}{#1}{#2}}

\begin{document}
\begin{align*}
S\# &\to aA \OR bA\\
A\# &\to aA \OR bA\\
\# A &\to Aa \OR Ab \\
\stack A\# &\to \stack aA \OR \stack bA \\
A &\to a \OR b
\end{align*}
\end{document}

在此处输入图片描述

我应该指出,LaTeX 纯粹主义者会反对 ,\stack aA而会改写\stack{a}{A}。 (并且可能\newcommand*{\OR}{\ |\ }。)我倾向于对此类事情不那么挑剔。

答案2

\above是一种堆叠字母/单词的方法。但由于这些公式看起来像数组,并且每个单元格只包含一个符号,为什么不使用 -environment array

\documentclass{article}
\usepackage{amsmath}

\begin{document}
\begin{align*}
  \begin{array}{ccc}
  \hphantom{\#} & \# & \# \\
                & S  & \# \\
  &\#
  \end{array}
  &\rightarrow
  \begin{array}{ccc}
  \hphantom{\#} & \# & \# \\
                & a  & S  \\
  &S
  \end{array}
  \\
  \begin{array}{ccc}
  \\
  \#            & S  & S  \\
  & \#
  \end{array}
  &\rightarrow
  \begin{array}{ccc}
  \\
  \#            & a  & D  \\
  & S
  \end{array}
\end{align*}
\end{document}

在此处输入图片描述

答案3

将其堆叠(在 内array)。在这里,我使用空格作为列分隔符,并将其设置@为空白占位符。我还将其设置#\catcode=12在组内。

这让我可以在上面的组中建立方程式

\tC{@ # @\\a S #\\@ # @} \rightarrow \tC{@ # @\\a a #\\@ S @}

在下面一组中

S
\Rightarrow\lU{a S\\S @}
\Rightarrow\lU{a a S\\S S @}

妇女权利委员会:

\documentclass{article}
\usepackage{tabstackengine,array}
\let\tC\tabbedCenterstack
\let\lU\tabbedLongunderstack
\setstacktabbedgap{.7ex}%
\setstackgap{L}{1.2\normalbaselineskip}
\stackMath
\setstackTAB{ }%
\begin{document}
\noindent Rewriting rules:
\begin{center}
\bgroup
\extrarowheight=4ex\relax
\catcode`#=12 %
\arraycolsep=1.5em\relax%
\catcode`@=\active %
\def@{}%
$\begin{array}{ccc}
\tC{# #  \\S #  \\# @  } \rightarrow \tC{# #  \\a S  \\S @  } & 
\tC{@ # @\\a S #\\@ # @} \rightarrow \tC{@ # @\\a a #\\@ S @} \\
\tC{@ @ @\\# S S\\@ # @} \rightarrow \tC{@ @ @\\# a D\\@ S @} &
\tC{@ @ @\\a D S\\@ # @} \rightarrow \tC{@ @ @\\a a D\\@ S @} &
\tC{a #  \\D #  \\# @  } \rightarrow \tC{a #  \\a #  \\S @  } \\
\end{array}$
\egroup
\end{center}
\bigskip
A derivation example:
\begin{center}
\bgroup
\extrarowheight=4ex\relax
\catcode`#=12 %
\arraycolsep=1.5em\relax%
\catcode`@=\active %
\def@{}%
$\begin{array}{l}
S
\Rightarrow\lU{a S\\S @}
\Rightarrow\lU{a a S\\S S @}
\Rightarrow\lU{a a a S\\S S S @}
\Rightarrow\lU{a a a a\\S S S S}
\Rightarrow\lU{a a a a\\a D S S\\S @ @ @}
\Rightarrow\lU{a a a a\\a a D S\\S S @ @}\\
\phantom{S}
\Rightarrow\lU{a a a a\\a a a D\\S S S @}
\Rightarrow\lU{a a a a\\a a a a\\S S S S}
\Rightarrow\lU{a a a a\\a a a a\\a E S S}
\Rightarrow\lU{a a a a\\a a a a\\a a E S}
\Rightarrow\lU{a a a a\\a a a a\\a a a E}
\Rightarrow\lU{a a a a\\a a a a\\a a a a}
\end{array}$
\egroup
\end{center}
\end{document}

在此处输入图片描述

相关内容