2011-09-19 25 views
0

我提出的bbcode解析器用PEG(柑橘實施紅寶石),我被困在解析這個[b]sometext[anothertext[/b]與PEG的問題製作的BBcode解析器

有代碼

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之外的所有內容。 使用這種實現它失敗的例子,因爲[和](那是錯誤的)

所以finaly問題是怎麼做的規則,可以匹配不同的東西排除\ r \ n或open_tag或close_tag

的精確匹配

如果您有針對另一個PEG實現的解決方案,請將其提供給那裏。我可以切換:)

回答

0

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

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

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

結束瞭解​​析錯誤

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

尋找臨時解決方案 ((!open_tag | !close_tag | !new_line) .) 它會找到一個字母只是一個字母,但忽略所有打開和關閉標籤。這些信件我可以後來加入:)

0

我剛纔遇到類似的問題。有一個技巧要做到這一點:
你需要說匹配open_tag,其次是所有不是結束標籤,然後closing_tag。所以這給出了以下規則:

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