1

语法有4个词汇元素

G = (S, N, T, P)

其中 G = 语法,S = 起始符号,N = 非终结符,T = 终结符,P = 生产规则

我想知道 N 是否总是与 P 相等,因为我知道 P 是词位,可以用其他词位代替

所以在这个例子中:

<program> --> <stmts>
<stmts> --> <stmt> | <stmt> ; <stmts>
<stmt> --> <var> = <expr>
<var> --> a | b | c | d
<expr> --> <term> + <term> | <term> - <term>
<term> --> <var> | const

S: <program>
N: <program>, <stmts>, <var>, <expr>, <term>
T: ;, a, b, c, d, +, -, const
P: <program>, <stmts>, <var>, <expr>, <term>

是对的吗?

4

2 回答 2

2

编号|N| 不一定 = |P|。考虑:

<program> --> <stmts>
<stmts> --> <stmt> 
<stmts> -->| <stmt> ; <stmts>
<stmt> --> <var> = <expr>
<var> --> a 
<var> --> b
<var> --> c
<var> --> d
<expr> --> <term> + <term> 
<expr> --> <term> - <term>
<term> --> <var> 
<term> --> const

您的问题是您对语法规则中允许的内容不准确。

您可以通过坚持没有规则具有相同的左侧来强制规则的数量与非终结符匹配。要做到这一点,你不能坚持简单的 BNF;您必须至少交替扩展 BNF。

PS:这实际上与语法的“词汇元素”无关。它只是关于语法的定义。

于 2012-05-30T00:16:49.860 回答
2

听起来像功课......你基本上是对的,只有 P是实际规则

G = (S, N, T, P)

S: <program>
N: <program>, <stmts>, <var>, <expr>, <term>
T: ;, a, b, c, d, +, -, const
P: <program> --> <stmts>, 
   <stmts> --> <stmt> | <stmt> ; <stmts>,
   <stmt> --> <var> = <expr>,
   <var> --> a | b | c | d,
   <expr> --> <term> + <term> | <term> - <term>,
   <term> --> <var> | const

没有规则,a 语法是无用的。

于 2012-06-01T13:19:57.000 回答