2009-09-17 36 views
6

我是新來的解析器生成器,我想知道如何像JSP/ASP/PHP的嵌入式語言的ANTLR語法看起來像,但不幸的是ANTLR網站不提供任何這樣的語法文件。如何爲JSP/ASP/PHP語言編寫ANTLR解析器?

更確切地說,我不知道如何定義一個匹配所有東西的AnyText標記(包括代碼塊外沒有任何含義的關鍵字),並且仍然能夠在塊內正確識別它們。

例如,下面的剪切應該被標記爲類似:AnyText,BlockBegin,Keyword,BlockEnd,AnyText。

lorem ipsum KEYWORD dolor sit <% KEYWORD %> amet 

也許還有另一個解析器生成器,它更適合我的需要。我到目前爲止只嘗試過ANTLR,因爲它在這裏的流行度很高,在stackoverflow :)

非常感謝提前!

+1

任何運氣得到這個工作 – etheros

回答

3

我不能說ANTLR,因爲我使用了不同的詞法分析器/解析器(DMS Software Reengineering Toolkit,我已經爲此準備了這樣的JSP和PHP詞法分析器/解析器)(ASP與您在您的問題)

但基本的想法是,詞法分析器需要詞法模式來識別何時拾取「anytext」以及何時處理「真正的」編程語言文本 因此,您需要一個開始的詞法模式,比如說HTML,它的工作是吸收HTML 文本,當它遇到到PHP的轉換時,切換模式。 您還需要一個PHP模式,它接收所有PHP令牌 並切換回HTML模式e遇到轉換字符時。 這裏有一個素描:

%%HTML -- mode 
#token HTMLText "~[]* \< \% " 
    << (GotoPHPMode) >> 

%%PHP -- mode 
#token KEYWORD "KEYWORD" 
... 
#token '%>' "\%\>" 
    << (GotoHTMLMode) >> 

你的詞法分析器發電機很可能有某種模式切換功能 ,你將不得不使用,而不是這個。你可能會發現, 詞法的HTML東西比它更復雜看起來(你不必擔心 約< SCRIPT標籤和許多其他瘋狂的HTML的東西,但這些都是 細節我相信你能處理。

+0

感謝您迴應的模式切換可能?確實是一個解決方案,儘管ANTLR還是有點問題,因爲只有詞法分析器應該被切換,並且解析器必須保持不變。 (否則將很難解析像「<% for ... %> AnyText <% endfor %>」)。 我探索的最簡單的解決方案是使用boost :: spirit。在那裏,解析器調用詞法分析器,因此您可以在不使用切換模式的情況下,根據需要編寫儘可能多的規則,包括anychar_p。 – tux21b