【问题标题】:Are regexs allowed in BNF and EBNF notations?BNF 和 EBNF 表示法中是否允许使用正则表达式?
【发布时间】:2016-07-31 10:27:30
【问题描述】:

例如,如果我想定义 Lisp 编程语言,其中名称甚至可以包含非字母数字字符,我是否应该使用如下符号列出所有可用字符:

validchar ::= "a" | "b" | "c" ... "-" | "*" | "$" ... ;
name = validchar, (validchar | digit)+;

或者我可以使用正则表达式,例如:

validchar ::= "[^(^)^\s^\d]";
name ::= validchar, (validchar | digit)*;

甚至:

name ::= "[^(^)^\s^\d]", "[^(^)^\s]"*;

这会大大缩短它,它甚至会包含₩、¥、€等字符,我无法列出但实际上是可用的。

【问题讨论】:

    标签: bnf ebnf


    【解决方案1】:

    这是否允许取决于您使用的实现 (E)BNF 表示法的工具。

    有些工具相当严格并且坚持 (E)BNF 的原始定义,最多允许在语言标记上使用 Kleene * 或 +。另外一点是,经典的 (E)BNF 不需要将字符作为终端进行操作。

    显然,能够直接根据字符定义一些语言标记很方便,并且可以想象(如您所见)一个 EBNF,其中不仅可以将字符编写为终端,还可以对字符进行正则表达式。

    您建议使用的工具是否允许...完全取决于工具。许多处理 (E)BNF 的工具(例如 YACC)实际上被设计为与另一个工具一起工作,即定义标记字符序列的“词法分析器生成器”(对于 YACC,这称为 FLEX)。使用这样的工具对,(E)BNF 工具通常不允许在其上提及任何字符或正则表达式,但词法分析器生成器工具明确允许对标记进行字符和正则表达式规范。

    有数百个 (E)BNF 和词法分析器生成器工具,每个工具都有一些(完全不同的)规则。检查工具文档。

    或者按照你想要的方式编写它,然后构建你自己的(第 101 个)工具。

    【讨论】:

      猜你喜欢
      • 2015-05-21
      • 1970-01-01
      • 1970-01-01
      • 2010-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多