(扩展)常规语法可以在其RHS中具有多个非终结符吗?

时间:2016-05-10 14:59:23

标签: regex regular-language

标准(右)常规语法有三种规则:

A <- ""
A <- "a"
A <- "a" B

从理论的角度来看,这是可以的,但在实践中可以使用很大的不便。实用的常规语法应该允许我们使用商品运算符(|*+?.(,{{ 1}}),字符集和单个多个规则组合在一起。例如,以下常规语法描述了小数:

)

问题是,必须对RHS非终端设置哪些限制才能使这些语法保持正常(如果可能的话)?

注意

Q - 为什么要使用常规语法而不是正则表达式?

A - 正则表达式适用于简单语言,但对于更复杂的语言,它们是只写的。另一方面,编写良好的扩展常规语法分配更易读和可维护,并允许我们使用捕获和规则操作轻松扩展它们。

1 个答案:

答案 0 :(得分:0)

  

必须对RHS非终端应用什么限制才能使这些语法保持正常

基本上你不想发明新的语法规则,你只需要将多个语法规则的符号(句法)缩写成一个。这就是限制:你必须对新语法有一些定义,关于如何将它“回”成有限数量的严格(正确)常规语法规则。

对于你给出的例子,那是

  • A <- α | βA <- α; A <- β
  • A <- [αβ…]A <- α; A <- β; …
  • A <- .A <- [Σ]
  • A <- B ?A <- ε; A <- B
  • A <- B *A <- X; X <- ε; X <- BX
  • A <- B +A <- X; X <- B; X <- BX

这里我们遇到了一个问题,因为X <- BX不是常规语法规则。但是,我们可以复制B及其允许的所有子项:

  • B <- εBX <- X
  • B <- αBX <- α X
  • B <- α CBX <- α CX(然后对CX执行相同操作)

通常,您可以将整个正则表达式用于语法规则的终端部分。只需将其转换为常规语法,并将相应的非终端附加到所有最终规则。