我试图通过一个带有一些障碍的例子来理解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"的语法。
答案 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自动处理此类排除。