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

时间:2015-01-05 19:09:59

标签: syntax indentation bnf ebnf vertical-text

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

例如在python 2.x中,我们称之为indentation

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

hello()

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

进一步的例子(降价):

MyHeader
========
topic
-----

注意 M并且第一个=放置在相同的垂直对齐方式(同时r和最后=,t和第一个{ {1}},-和最后c

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

进一步说明: 我对此问题的观点是搜索表示代码垂直对齐的表示方法,而不仅仅是想知道如何编写-Python的BNF或EBNF。

1 个答案:

答案 0 :(得分:10)

你可以通过使用一点hack来解析缩进敏感语言(比如Python或Haskell),这在Python语言参考的lexical analysis章节中有详细描述。如上所述,词法分析器将前导空格转换为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]

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

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

ISO standard EBNF(提供免费的PDF)提供了一种包含“用户可能需要的扩展程序”的方法:Special-sequence,这是任何不包含的文本?两边被包围。所以你可以通过加入[注2]来滥用这种表示法:

DEDENT = ? See section 2.1.8 of https://docs.python.org/3.3/reference/ ? ;

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

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

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

注释

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

  2. EBNF通常使用语法=而不是::=进行制作,并坚持使用;终止它们。评论附在(**)之间。