PEG 解析匹配至少一个保留顺序
PEG parsing match at least one preserving order
鉴于 PEG 规则:
rule = element1:'abc' element2:'def' element3:'ghi' ;
我如何重写它,使其至少匹配一个元素,但可能在执行它们的命令时匹配所有元素?
即我想匹配以下所有行:
abc def ghi
abc def
abc ghi
def ghi
abc
def
ghi
但不能是空字符串或乱序的表达式,例如def abc
.
当然对于三个元素,我可以在单独的规则中拼出组合,但是随着元素数量的增加,这变得容易出错。
有没有办法以简洁的方式指定它?
您可以使用选项:
rule = [element1:'abc'] [element2:'def'] [element3:'ghi'] ;
您将为 rule
使用语义操作来检查是否至少匹配了一个标记:
def rule(self, ast):
if not (ast.element1 or ast.element2 or ast.element3):
raise FailedSemantics('Expecting at least one token')
return ast
另一种选择是使用多个选项:
rule
=
element1:'abc' [element2:'def'] [element3:'ghi']
| [element1:'abc'] element2:'def' [element3:'ghi']
| [element1:'abc'] [element2:'def'] element3:'ghi'
;
缓存将使后者与前者一样高效。
然后,您可以添加 cut 元素以获得更高的效率和更有意义的错误消息:
rule
=
element1:'abc' ~ [element2:'def' ~] [element3:'ghi' ~]
| [element1:'abc' ~] element2:'def' ~ [element3:'ghi' ~]
| [element1:'abc' ~] [element2:'def' ~] element3:'ghi' ~
;
或:
rule = [element1:'abc' ~] [element2:'def' ~] [element3:'ghi' ~] ;
答案是:析取的一个先决条件,然后是一系列可选项。
rule = &(e1 / e2 / e3) e1? e2? e3?
这是标准 PEG,& 表示 'must be present but not consumed' 和 ?意思是 'optional'。如果没有这些符号,大多数 PEG 解析器都具有这些功能。
鉴于 PEG 规则:
rule = element1:'abc' element2:'def' element3:'ghi' ;
我如何重写它,使其至少匹配一个元素,但可能在执行它们的命令时匹配所有元素?
即我想匹配以下所有行:
abc def ghi
abc def
abc ghi
def ghi
abc
def
ghi
但不能是空字符串或乱序的表达式,例如def abc
.
当然对于三个元素,我可以在单独的规则中拼出组合,但是随着元素数量的增加,这变得容易出错。
有没有办法以简洁的方式指定它?
您可以使用选项:
rule = [element1:'abc'] [element2:'def'] [element3:'ghi'] ;
您将为 rule
使用语义操作来检查是否至少匹配了一个标记:
def rule(self, ast):
if not (ast.element1 or ast.element2 or ast.element3):
raise FailedSemantics('Expecting at least one token')
return ast
另一种选择是使用多个选项:
rule
=
element1:'abc' [element2:'def'] [element3:'ghi']
| [element1:'abc'] element2:'def' [element3:'ghi']
| [element1:'abc'] [element2:'def'] element3:'ghi'
;
缓存将使后者与前者一样高效。
然后,您可以添加 cut 元素以获得更高的效率和更有意义的错误消息:
rule
=
element1:'abc' ~ [element2:'def' ~] [element3:'ghi' ~]
| [element1:'abc' ~] element2:'def' ~ [element3:'ghi' ~]
| [element1:'abc' ~] [element2:'def' ~] element3:'ghi' ~
;
或:
rule = [element1:'abc' ~] [element2:'def' ~] [element3:'ghi' ~] ;
答案是:析取的一个先决条件,然后是一系列可选项。
rule = &(e1 / e2 / e3) e1? e2? e3?
这是标准 PEG,& 表示 'must be present but not consumed' 和 ?意思是 'optional'。如果没有这些符号,大多数 PEG 解析器都具有这些功能。