2011-03-26 139 views
0

我試圖寫一個語法來解析Media wiki's wiki syntax,之後Creole syntax too(遺憾的是existing Creole grammar在Antlr 3中不起作用)。ANTLR中的Mediawiki解析:處理'令牌

我現在的問題是能夠捕捉一個大膽的規則,當我已經在一個斜體規則,或反之亦然。例如

'' this text is bold '''now it's italic''' and just bold again'' 

我有很大的幫助,從this question但我堅持。目標是在語法中使用動作或可能的AST生成HTML - 我不確定哪個最好。

回答

1

作爲練習,我創建了一個鏈接到MediaWiki分析器,以及和不匹配開放和關閉標籤的粗體和斜體,而是調用這樣的切換:

grammar MediaWiki; 

options { 
    output=AST; 
    backtrack=true; 
    memoize=true; 
} 

... 

// entry point of the parser 
parse 
    : atom+ EOF -> ^(ROOT atom+) 
    ; 

atom 
    : formatToggle 
    | horizontalRule 
    | header 
    | link 
    | list 
    | preFormattedText 
    | table 
    | ... 
    | any 
    ; 

formatToggle 
    : SQt SQt SQt SQt SQt -> BOLD_ITALIC 
    | SQt SQt SQt   -> BOLD 
    | SQt SQt    -> ITALIC 
    ; 

... 

SQt 
    : '\'' 
    ; 

然後MediaWiki格式的翻譯(轉換爲HTML?),當遇到BOLD_ITALIC,BOLDITALIC之一時,您不斷翻轉一些布爾標誌。

我還沒有正確測試過我的語法,所以我不打算在這裏發佈整個語法。

祝你好運!

+0

謝謝 - 你在mediawiki語法中找到了什麼地方嗎?我開始認爲即使是Antlr的LL(*)解析器也無法處理它的糟糕的標記設計,我應該用一些替換字符串將它變成克里奧爾語,併爲此建立一個語法。 – 2011-03-27 10:23:05

+0

@Chris,是的,我差不多完成了。但是有太多含糊之處,我開啓了全球回溯(並且爲了提高性能,還啓用了記憶功能)。由於這個原因,ANTLR需要大約20秒才能創建詞法分析器和解析器,我必須將堆空間增加到256 MB。當然,在解析實際的Wiki源代碼時,我不需要太多RAM,只需要生成詞法分析器和分析器就需要相當多的堆空間。祝你好運! – 2011-03-27 10:33:59

+0

聽起來像ANTLR不是維基引擎(或任何其他類似Gold解析器/ Grammatica的解決方案,但它們打破無效標記) – 2011-03-27 10:51:06