在 Stackoverflow 上读了无数次关于“如何使用 Regex 解析 HTML”的问题后,我再次对语法感兴趣,拿起我的大学脚本,几分钟后我想知道我是如何通过考试的。
作为一个简单(嗯,“简单”,我期望它是)练习,我尝试编写一个 CFG 来生成有效的 python 元组(为简单起见,仅使用标识符a
,b
和c
)。经过一段美好的时光后,我现在想出了这个:
G = ( {Tuple, TupleItem, Id}, {“a”, “b”, “c”, “,”, “(“, “)”}, P, Tuple)
作为P:
Tuple → “(“ TupleItem “)”
Tuple → “(“ TupleItem Id “)”
Tuple → “(“ TupleItem Tuple “)”
TupleItem → TupleItem TupleItem
TupleItem → Id “,”
TupleItem → Tuple “,”
Id → “a”
Id → “b”
Id → “c”
这个语法应该产生例如(a,)
, (a,b)
, (a,b,)
, ((a,),)
, ((a,b,),(a,),)
, 但不是(,a)
, ()
,,
等(a,b c)
。我不想产生多余的括号,比如((a),)
or ((a,b))
。实际上,有时可选的(当不止一项时)有时是强制性的(当只有一项时)尾随逗号几乎要了我的命。
- 此语法是否生成所有有效的 python 元组(仅使用
a
,b
和c
)? - 这个语法会产生不是有效 python 元组的字符串吗?
- 这个语法正确吗?(我不确定循环标准)
- 为什么我的语法这么长?如何减少生产规则的数量?(不是通过使用像管道这样的语法糖,因为它们只将几条规则放在一行上。)
提前感谢您的评论和回答。