\documentclass[a4paper]{article}
\usepackage[margin=1in]{geometry}
\usepackage{fontspec}

\setmonofont[Scale=0.7]{Hurmit Nerd Font Mono}

\newcommand{\languageline}[2]{%
  \textit{#1} & $\to$ & #2
}

\begin{document}
\begin{table}[ht]
  \begin{center}
    \begin{tabular}{|lcl|}
      \hline
      \multicolumn{3}{|c|}{\textbf{Top-level}} \\ \hline
        \languageline{program}{\textit{optional-newline} \textit{module-calls} \textit{statements}} \\ \hline

        \languageline{module-calls}{\textit{module-call} \textbf{newline} \textit{module-calls}} \\
        \languageline{module-calls}{} \\ \hline

        \languageline{module-call}{\texttt{CUM} \textbf{module-name}} \\ \hline

        \languageline{statements}{\textit{statement} \textbf{newline} \textit{statements}} \\
        \languageline{statements}{} \\ \hline

        \languageline{optional-newline}{\textbf{newline}} \\
        \languageline{optional-newline}{} \\ \hline \hline

      \multicolumn{3}{|c|}{\textbf{Statements}} \\ \hline
        \languageline{statement}{\textit{expression}} \\
        \languageline{statement}{\texttt{DESIGNA} \textbf{id} \texttt{VT} \textit{expression}} \\
        \languageline{statement}{\texttt{DEFINI} \textbf{id} \texttt{(} \textit{optional-ids} \texttt{)} \textit{scope}} \\
        \languageline{statement}{\textit{if-statement}} \\
        \languageline{statement}{\texttt{DVM} \textit{expression} \texttt{FACE} \textit{scope}} \\
        \languageline{statement}{\texttt{PER} \textbf{id} \texttt{IN} \textit{expression} \texttt{FACE} \textit{scope}} \\
        \languageline{statement}{\texttt{DONICVM} \textbf{id} \texttt{VT} \textit{expression} \texttt{VSQVE} \textit{expression} \texttt{FACE} \textit{scope}} \\
        \languageline{statement}{\texttt{REDI(} \textit{optional-expressions} \texttt{)}} \\
        \languageline{statement}{\texttt{ERVMPE}} \\ \hline

        \languageline{if-statement}{\texttt{SI} \textit{expression} \textit{scope}} \\
        \languageline{if-statement}{\texttt{SI} \textit{expression} \textit{scope} \textit{optional-newline} \textit{else-statement}} \\ \hline

        \languageline{else-statement}{\texttt{ALVID} \textit{scope}} \\
        \languageline{else-statement}{\texttt{ALVID} \textit{if-statement}} \\ \hline

        \languageline{scope}{\textit{optional-newline} \texttt{\{} \textbf{newline} \textit{statements} \texttt{\}}} \\ \hline \hline

      \multicolumn{3}{|c|}{\textbf{Expressions}} \\ \hline
        \languageline{expression}{\texttt{(} \textit{expression} \texttt{)}} \\
        \languageline{expression}{\textbf{id}} \\
        \languageline{expression}{\textbf{builtin} \texttt{(} \textit{optional-expressions} \texttt{)}} \\
        \languageline{expression}{\texttt{INVOCA} \textbf{id} \texttt{(} \textit{optional-expressions} \texttt{)}} \\
        \languageline{expression}{\textit{literal}} \\
        \languageline{expression}{\textit{expression} \texttt{[} \textit{expression} \texttt{]}} \\
        \languageline{expression}{\textit{expression} \textbf{binop} \textit{expression}} \\
        \languageline{expression}{\textbf{unop} \textit{expression}} \\ \hline
        \languageline{literal}{\textbf{string}} \\
        \languageline{literal}{\textbf{numeral}} \\
        \languageline{literal}{\textbf{bool}} \\
        \languageline{literal}{\texttt{[} \textit{optional-expressions} \texttt{]}} \\
        \languageline{literal}{\texttt{[} \textit{expression} \texttt{VSQVE} \textit{expression} \texttt{]}} \\ \hline \hline

      \multicolumn{3}{|c|}{\textbf{Lists}} \\ \hline
        \languageline{optional-ids}{ids} \\
        \languageline{optional-ids}{} \\ \hline

        \languageline{ids}{\textbf{id}, \textit{ids}} \\
        \languageline{ids}{\textbf{id}} \\ \hline

        \languageline{optional-expressions}{expressions} \\
        \languageline{optional-expressions}{} \\ \hline

        \languageline{expressions}{\textit{expression}, \textit{expressions}} \\
        \languageline{expressions}{\textit{expression}} \\ \hline
    \end{tabular}
  \end{center}
\end{table}

\begin{itemize}
  \item \textbf{newline}: \\ Newlines are combined, so a single newline is the same as multiple.
  \item \textbf{module-name}:
  \item \textbf{id}:
  \item \textbf{builtin}:
  \item \textbf{string}:
  \item \textbf{numeral}:
  \item \textbf{bool}:
\end{itemize}

\end{document}