Parsing PEG解析至少匹配一个保留顺序
考虑到联系汇率规则:Parsing PEG解析至少匹配一个保留顺序,parsing,ebnf,peg,grako,Parsing,Ebnf,Peg,Grako,考虑到联系汇率规则: 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' ;
我如何重写它,使它至少与其中一个元素匹配,但可能在执行它们的顺序时与所有元素都匹配
即,我希望匹配以下所有行:
abc def ghi
abc def
abc ghi
def ghi
abc
def
ghi
但不是空字符串或顺序错误的表达式,例如def abc
当然,对于三个元素,我可以用单独的规则来描述它们的组合,但是随着元素数量的增加,这很容易出错
有没有办法以简洁的方式指定此选项?您可以使用选项:
rule = [element1:'abc'] [element2:'def'] [element3:'ghi'] ;
您可以使用规则的语义操作来检查是否至少有一个令牌匹配:
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'
;
缓存将使后者与前者一样高效
然后,您可以添加剪切元素,以提高效率并获得更有意义的错误消息:
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'] ;
您可以使用规则的语义操作来检查是否至少有一个令牌匹配:
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'
;
缓存将使后者与前者一样高效
然后,您可以添加剪切元素,以提高效率并获得更有意义的错误消息:
rule
=
element1:'abc' ~ [element2:'def' ~] [element3:'ghi' ~]
| [element1:'abc' ~] element2:'def' ~ [element3:'ghi' ~]
| [element1:'abc' ~] [element2:'def' ~] element3:'ghi' ~
;
或:
答案是:一个先决条件是不相交的,然后是一系列选项
rule = &(e1 / e2 / e3) e1? e2? e3?
这是标准的PEG,带有&的意思是“必须存在但不能消费”,以及?意思是“可选”。如果没有这些符号,大多数PEG解析器都有这些功能。答案是:先有一个先决条件,然后是一系列的选项
rule = &(e1 / e2 / e3) e1? e2? e3?
这是标准的PEG,带有&的意思是“必须存在但不能消费”,以及?意思是“可选”。如果没有这些符号,大多数PEG解析器都有这些功能。感谢您如此透彻地解释这些选项。感谢您如此透彻地解释这些选项。