如何使用BNF,EBNF等表示代码语法的垂直对齐?

fro*_*hem 8 syntax indentation bnf ebnf vertical-text

怎么说(在BNF,EBNF等中)任何两个或多个字母都放在同一个垂直对齐中

例如在python 2.x中,我们有我们所说的indentation.

def hello():
    print "hello," 
    print "world"

hello()
Run Code Online (Sandbox Code Playgroud)

注意字母p(第二行)放置在相同的垂直对齐字母p(第三行)

进一步的例子(降价):

MyHeader
========
topic
-----
Run Code Online (Sandbox Code Playgroud)

注意 M和第一个=放在相同的垂直对齐方式(也是r最后一个=,t和第一个-,c最后一个-)

我的问题是如何使用BNF,EBNF等表示这些字母的垂直对齐?

此外,注意: 我对这个问题的一点是寻找一种表示方法来表示的代码垂直排列,不只是想知道如何编写BNF或EBNF PythonMarkdown.

ric*_*ici 10

您可以使用一个小的hack来解析缩进敏感语言(如Python或Haskell),这在Python语言参考的词法分析章节中有详细描述.如所描述的,词法分析器匝前导空白为INDENTDEDENT令牌[注1],然后将其在Python语法中使用以直接的方式.这是一个小摘录:

suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
while_stmt    ::=  "while" expression ":" suite ["else" ":" suite]
Run Code Online (Sandbox Code Playgroud)

因此,如果您准备描述(或参考)词法分析算法,BNF很简单.

但是,您实际上无法将该算法编写为无上下文语法,因为它不是无上下文的.(我将省略证据,但它类似于不具有上下文的证据,您可以在大多数基本的正式语言教科书中找到它,并且可以在整个互联网上找到.)anbncn

ISO标准EBNF(提供免费的PDF)提供了一种包括"用户可能需要的扩展"的方式:a Special-sequence,这是任何不包含?两侧的文本的文本?.所以你可以通过加入[注2]来滥用这种表示法:

DEDENT = ? See section 2.1.8 of https://docs.python.org/3.3/reference/ ? ;
Run Code Online (Sandbox Code Playgroud)

或者您可以插入算法的完整描述.当然,这些技术都不允许解析器生成器生成准确的词法分析器,但这是将意图传达给人类读者的合理方式.

值得注意的是,EBNF本身使用特殊序列来定义其中一个产品:

(* see 4.7 *) syntactic exception
   = ? a syntactic-factor that could be replaced
       by a syntactic-factor containing no
       meta-identifiers
     ? ;
Run Code Online (Sandbox Code Playgroud)

笔记

  1. 词法分析器还将一些物理换行符转换为NEWLINE标记,同时使其他换行符消失.

  2. EBNF通常使用语法=而不是::=生产,并坚持使用它们终止;.评论包含在(*和之间*).

  • @anentropic:就是这个意思。词法分析器需要具有缩进位置的堆栈,并且您不能在CFG中表示这样的堆栈。 (2认同)