哪个包可用于编写 BNF 语法?

哪个包可用于编写 BNF 语法?

我用 Google 搜索并找到了两个包:

  1. 工具
  2. 法国国家报

不幸的是,这两本书的文档都非常差。每本书只有一到两个例子,很难理解。此外,它们都没有展示如何正确缩进语法,而只是设置环境以获得美观​​的外观。我想知道是否有一个主要的包可以编写 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

backnaurCTAN 上的软件包非常适合这个。

该包排版了 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}

渲染如下:

BNF 示例

答案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}

simplebnf 样本渲染

此软件包提供了一种以 Backus-Naur 范式 (BNF) 排版语法的简单方法。它具有灵活的配置系统,允许自定义用于排版语法的领域特定语言 (DSL)。此外,该软件包还附带合理的默认值。

免责声明:我是该软件包的作者。

相关内容