创建具有限制的Context-Free-Grammar

时间:2018-01-10 01:15:18

标签: grammar context-free-grammar

我试图通过一个带有一些障碍的例子来理解CFG。

例如,我想匹配双变量的声明:

双d;在这种情况下," d"可以是任何其他有效的标识符。

有些情况不应该匹配,例如"加倍双倍;",但我不明白如何避免匹配第二个" double"

我的方法:

G = (Σ, V, S, P)
Σ = {a-z}
V = {S,T,U,W}
P = { S -> doubleTUW 
T -> _(space)
U -> (a-z)U | (a-z)
W -> ;
}

现在必须有一种方法可以通过使用函数L(G)来限制该语法的可能结果。不幸的是,我无法找到符合我要求否定第二个" double"的语法。

1 个答案:

答案 0 :(得分:1)

这是一个有点乏味的正则表达式,可以匹配double以外的任何标识符。将其转换为CFG可以通过机械方式完成,但更加繁琐。

([a-ce-z]|d[a-np-z]|do[a-tv-z]|dou[ac-z]|doub[a-km-z]|doubl[a-df-z]|double[a-z])[a-z]*

将其转换为CFG可以通过机械方式完成,但更加繁琐:

ALPHA → a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z
NOT_B → a|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z
NOT_D → a|b|c|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z
NOT_E → a|b|c|d|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z
NOT_L → a|b|c|d|e|f|g|h|i|j|k|m|n|o|p|q|r|s|t|u|v|w|x|y|z
NOT_O → a|b|c|d|e|f|g|h|i|j|k|l|m|n|p|q|r|s|t|u|v|w|x|y|z
NOT_U → a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|v|w|x|y|z
WORD  → NOT_D
      | d NOT_O
      | do NOT_U
      | dou NOT_B
      | doub NOT_L
      | doubl NOT_E
      | double ALPHA
      | WORD   ALPHA

这就是为什么我们中的许多人通常使用扫描仪生成器,如(f)lex自动处理此类排除。