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

Syntax 如何使用BNF、EBNF等表示代码语法的垂直对齐。?,syntax,indentation,bnf,ebnf,vertical-text,Syntax,Indentation,Bnf,Ebnf,Vertical Text,如何说(在BNF、EBNF等中)任意两个或多个字母处于同一垂直对齐状态 e、 在Python2.x中,我们有所谓的缩进 def hello(): print "hello," print "world" hello() 注意字母p(第二行)与字母p(第三行)处于同一垂直对齐位置 进一步示例(降价): 注意M和第一个=放置在相同的垂直对齐位置(同样r和最后一个=/code>,t和第一个-,c和最后一个-) 我的问题是如何使用BNF、EBNF等表示这些字母的垂直对齐? 进一步说

如何说(在BNF、EBNF等中)任意两个或多个字母处于同一垂直对齐状态

e、 在Python2.x中,我们有所谓的缩进

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

hello()
注意字母
p
(第二行)与字母
p
(第三行)处于同一垂直对齐位置

进一步示例(降价):

注意
M
和第一个
=
放置在相同的垂直对齐位置(同样
r
和最后一个
=/code>,t和第一个
-
c
和最后一个
-

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

进一步说明:
我的问题是寻找一种表示方法来表示代码的垂直对齐,而不仅仅是想知道如何编写
Python
Markdown
的BNF或EBNF,你可以使用一些技巧解析缩进敏感语言(如Python或Haskell),这在Python语言参考的一章中有很好的描述。如前所述,词法分析器将前导空格转换为
INDENT
DEDENT
标记[注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
不是上下文无关的证明,你可以在大多数初级正式语言教科书和互联网上找到这一证明。)

(提供免费PDF)提供了一种包含“用户可能需要的扩展”的方式:一个
特殊序列
,它是任何不包含?两边都被一个?。因此,您可能会滥用符号,包括[注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
     ? ;

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

  • EBNF通常对产品使用语法
    =
    ,而不是
    :=
    ,并坚持使用
    终止它们。注释包含在
    (*
    *)
    之间


  • 鉴于BNF能够表示上下文无关的语法,使用它们来表示事实上不是上下文无关的语法可能有点困难
    python
    并非完全与上下文无关;它的一部分是,但语言作为一个整体不是。任何其他方式,你可以回答我下面我只想解决方案,可以代表代码的垂直对齐。伟大的答案是!我不太清楚。。。这是否意味着使用词法分析器预处理后的结果可以用上下文无关语法来描述?但是词法分析器本身不能做到这一点吗?@anentropic:这就是它的意思。词法分析器需要有一个缩进位置堆栈,不能在CFG中表示这样的堆栈。
    (* see 4.7 *) syntactic exception
       = ? a syntactic-factor that could be replaced
           by a syntactic-factor containing no
           meta-identifiers
         ? ;