![哪个包可用于编写 BNF 语法?](https://linux22.com/image/239426/%E5%93%AA%E4%B8%AA%E5%8C%85%E5%8F%AF%E7%94%A8%E4%BA%8E%E7%BC%96%E5%86%99%20BNF%20%E8%AF%AD%E6%B3%95%EF%BC%9F.png)
我用 Google 搜索并找到了两个包:
- 工具
- 法国国家报
不幸的是,这两本书的文档都非常差。每本书只有一到两个例子,很难理解。此外,它们都没有展示如何正确缩进语法,而只是设置环境以获得美观的外观。我想知道是否有一个主要的包可以编写 BNF,或者我们可以手动使用制表符来处理缩进?谢谢。
答案1
这syntax
捆绑包中的包mdwtools
具有排版 BNF 语法的简单方法,并且对规则的格式化方式有一些合理的控制。
语法规则之间的间距可以用\grammarparsep
长度来设置。这是一个弹性长度,默认为8pt plus 1pt minus 1pt
。
生成规则左侧和右侧之间的距离由长度控制\grammarindent
。增加此值将使规则右侧进一步向右移动。
这两种长度都可以使用标准 LaTeX 命令设置\setlength
。
该\grammarlabel
命令控制规则左侧相对于生产运算符的设置方式。其默认定义是:
\newcommand{\grammarlabel}[2]{\synt{#1}\hfill#2}
其中#1
是非终结符,#2
是生产运算符。
这是使用两个长度值的示例文档。我故意将值调大,以便看到效果。\grammarlabel
如果我是你,我不会改变的定义。
\documentclass{article}
\usepackage{syntax}
\begin{document}
\paragraph{Default settings}
\begin{grammar}
<statement> ::= <ident> `=' <expr>
\alt `for' <ident> `=' <expr> `to' <expr> `do' <statement>
\alt `{' <stat-list> `}'
\alt <empty>
<stat-list> ::= <statement> `;' <stat-list> | <statement>
\end{grammar}
\paragraph{Increase the two lengths}
\setlength{\grammarparsep}{20pt plus 1pt minus 1pt} % increase separation between rules
\setlength{\grammarindent}{12em} % increase separation between LHS/RHS
\begin{grammar}
<statement> ::= <ident> `=' <expr>
\alt `for' <ident> `=' <expr> `to' <expr> `do' <statement>
\alt `{' <stat-list> `}'
\alt <empty>
<stat-list> ::= <statement> `;' <stat-list> | <statement>
\end{grammar}
\end{document}
答案2
也许你找到了替代方案语法图(或铁路图)。它们代表了巴科斯范式的图形替代形式。
对于 LaTeX,您可以使用铁路套票。它包含一个 LaTeX 样式和一个程序(编译的 exe 或 C 源)。文档示例附带以下包:
备注:铁路套票包含一个旧 exe。如果您在使用时遇到问题,德国提示如何在 Windows 7 (64 位) 上编译源代码。结果(改编的 makefile 和编译版本)也可在网站上找到:http://www.karsten-brodmann.de/downloads/Rail.zip。
还有合成基因一个从 BNF 生成语法图的工具(我没有使用该包的经验)。
又有一个新的包:简单bnf
还有一个:句法(使用 TikZ-Styles。德语描述)。
答案3
这backnaur
CTAN 上的软件包非常适合这个。
该包排版了 Backus-Naur 范式 (BNF) 定义。它创建了对齐的产生式列表,如果需要,还可以添加数字。它还可以使用数学模式打印内联 BNF 表达式。
此片段(来自文档):
\documentclass{article}
\usepackage{backnaur}
\begin{document}
\begin{bnf*}
\bnfprod{list}
{\bnfpn{listitems} \bnfor \bnfes}\\
\bnfprod{listitems}
{\bnfpn{item} \bnfor \bnfpn{item}
\bnfsp \bnfts{;} \bnfsp \bnfpn{listitems}}\\
\bnfprod{item}
{\bnftd{description of item}}
\end{bnf*}
\end{document}
渲染如下:
答案4
这CTAN 上的 simplebnf 包解析 BNF 表达式:
\begin{bnf}
$\tau$ : \textsf{Type} ::=
| \texttt{num} : numbers
| \texttt{str} : strings
;;
$e$ : \textsf{Expr} ::=
| $x$ : variable
| $n$ : numeral
| \texttt{$e$ + $e$} : addition
| \texttt{$e$ * $e$} : multiplication
| \texttt{$e$ \textasciicircum{} $e$} : concatenation
| \texttt{len($e$)} : length
| \texttt{let $x$ = $e_1$ in $e_2$} : definition
\end{bnf}
此软件包提供了一种以 Backus-Naur 范式 (BNF) 排版语法的简单方法。它具有灵活的配置系统,允许自定义用于排版语法的领域特定语言 (DSL)。此外,该软件包还附带合理的默认值。
免责声明:我是该软件包的作者。