标准(右)常规语法有三种规则:
A <- ""
A <- "a"
A <- "a" B
从理论的角度来看,这是可以的,但在实践中可以使用很大的不便。实用的常规语法应该允许我们使用商品运算符(|
,*
,+
,?
,.
,(
,{{ 1}}),字符集和单个多个规则组合在一起。例如,以下常规语法描述了小数:
)
问题是,必须对RHS非终端设置哪些限制才能使这些语法保持正常(如果可能的话)?
注意
Q - 为什么要使用常规语法而不是正则表达式?
A - 正则表达式适用于简单语言,但对于更复杂的语言,它们是只写的。另一方面,编写良好的扩展常规语法分配更易读和可维护,并允许我们使用捕获和规则操作轻松扩展它们。
答案 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 <- α C
⇒BX <- α CX
(然后对CX
执行相同操作)通常,您可以将整个正则表达式用于语法规则的终端部分。只需将其转换为常规语法,并将相应的非终端附加到所有最终规则。