Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing PEG解析至少匹配一个保留顺序_Parsing_Ebnf_Peg_Grako - Fatal编程技术网

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解析器都有这些功能。

感谢您如此透彻地解释这些选项。感谢您如此透彻地解释这些选项。