簡體   English   中英

使用PEG問題制作BBcode解析器

[英]Making BBcode parser with PEG problem

我正在用PEG(Ruby的Citrus實現)制作bbcode解析器,但我堅持解析此[b]sometext[anothertext[/b]

有代碼

grammar BBCodeParser
  rule document
    (open_tag | close_tag | new_line | text)*
  end
  rule open_tag
    ("[" tag_name "="? tag_data? "]")
  end

  rule close_tag
    ("[/" tag_name "]") 
  end

  rule text
    [^\n\[\]]+
  end

  rule new_line
    ("\r\n" | "\n")
  end

  rule tag_name
    # [p|br|b|i|u|hr|code|quote|list|url|img|\*|color]
    [a-zA-Z\*]+
  end

  rule tag_data
    ([^\[\]\n])+
  end
end

問題是規則text我不知道怎么說,該文本可以包含\\ r,\\ n,open_tag或close_tag以外的所有內容。 在此實現中,由於排除了[和]而導致示例失敗(那是錯誤的)

所以最后一個問題是如何做規則,該規則可以匹配\\ r,\\ n或open_tag或close_tag的完全匹配項之外的任何內容

如果您有其他PEG實施的解決方案,也請在此處提供。 我可以切換:)

不久前,我遇到了類似的問題。 有一個技巧可以做到這一點:
您需要先說說match open_tag ,然后說不是結束標記的所有內容,然后是closing_tag 所以這給出了以下規則

rule tag
  open_tag ((!open_tag | !close_tag | !new_line ) .)+ close_tag
end

這將解析任何文本,並在[不是另一個標簽的開頭時遞歸繼續。

rule text
    [^\n\[\]]+ (!open_tag text)?
end

這個

rule text
    [^\n\[\]]+ (!open_tag text)?
end

以解析錯誤結束

我試圖繼續這個想法,結果是([^\\n] (!open_tag | !close_tag) text*)但它也會失敗。 它將匹配"sometext[anothertext[/b]"

查找臨時解決方案((!open_tag | !close_tag | !new_line) .)它將只查找一個字母一個字母,但忽略所有打開和關閉標簽。 這些信件我以后可以在一起:)

暫無
暫無

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

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