我正在使用 PLY 编写解析器。解析器所用的语言称为 s-lang,在该语言的语法中,我有以下产生式:
IdentList → IdentList ,标识符 ArrayBrackets*
我已经为 ArrayBrackets 编写了产品。我尝试将上述产品编写为
def p_IdentList(t):
'''IdentList : IdentList COMMA ID ArrayBrackets*'''
我有变量 COMMA 和 ID 的正则表达式。问题是当我包含星号时,出现以下错误:
ERROR: main.py:115: Illegal name 'ArrayBrackets*' in rule 'IdentList'
Traceback (most recent call last):
File "main.py", line 175, in <module>
我试图逃避明星,但它没有帮助 --- 我应该如何在作品中编写 Kleene 闭包?
[编辑]
在仔细检查了这个问题之后,我看到@GrijeshChauhan 说,给定一个非终结符 e。e 的 Kleene 闭包,即 e* 将由以下产生式给出
S → eS | ^
whereeS
是 with 的连接,e
并且S
是^
null/empty/epsilon。我的问题是, e 必须是终端吗?我可以不应用相同的逻辑为非终结符生成新的产品吗,例如:
def p_ArrayBracketsSTAR(t):
'''ArrayBracketsSTAR : ArrayBracketsSTAR ArrayBrackets | '''