簡體   English   中英

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' 
    ;

高速緩存將使后者的效率與前者一樣高。

然后,您可以添加剪切元素以提高效率和更有意義的錯誤消息:

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,帶有&表示“必須存在但不消耗”和? 意思是“可選”。 如果沒有這些符號,大多數PEG解析器都具有這些功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM