2009-02-10 12 views
1

我想解析簡單的C++如如何解析簡單的C++ typedef指令?

typedef Class NewNameForClass; 
typedef Class::InsideTypedef NewNameForTypedef; 
typedef TemplateClass<Arg1,Arg2> AliasForObject; 

我已經寫,我想看到在解析中使用的相應語法的typedef指令。

Name <- ('_'|letter)('_'|letter|digit)* 
Type <- Name 
Type <- Type::Name 
Type <- Name Templates 
Templates <- '<' Type (',' Type)* '>' 
Instruction <- "typedef" Type Name ';' 

一旦被解析,所有我會想要做的是產生具有相同信息的XML(但不同奠定了)

什麼是最有效的語言寫這樣的程序? 你怎麼能做到這一點?

編輯:我已經想出了使用升壓精神(它不是完美的,但現在已經足夠好對我來說,至少)

rule<> sep_p = space_p; 
    rule<> name_p = (ch_p('_')|alpha_p) >> *(ch_p('_')|alpha_p|digit_p); 
    rule<> type_p = name_p 
      >> !(*sep_p >>str_p("::") >> *sep_p>> name_p) 
      >> *(*sep_p >> ch_p('*')) 
      >> !(*sep_p >> str_p("const")) 
      >> !(*sep_p >> ch_p('&')); 
    rule<> templated_type_p = name_p >> *sep_p 
      >> ch_p('<') >> *sep_p 
      >> (*sep_p>>type_p>>*sep_p)%ch_p(',') 
      >> ch_p('>') >> *sep_p; 

    rule<> typedef_p = *sep_p 
        >> str_p ("typedef") 
        >> +sep_p >> (type_p|templated_type_p) 
        >> +sep_p >> name_p 
        >> *sep_p >> ch_p(';') >> *sep_p; 
    rule<> typedef_list_p = *typedef_p; 

回答

1

我將改變語法略有

ShortName <- ('_'|letter)('_'|letter|digit)* 
Name <- ShortName 
Name <- Name::ShortName 
Type <- Name 
Type <- Name Templates 
Templates <- '<' Type (',' Type)* '>' 
Instruction <- "typedef" Type Name ';' 

而且你的語法省去了以下情況

  1. 多的typedef目標。
  2. 指針目標
  3. 函數指針(這是迄今爲止最困難的)

解析語法(我愛諷刺)是一個相當簡單的操作。如果你想真正以功能性的方式使用語法,我會說最好的選擇是lex/yacc組合。

但從你的問題看來,你想吐出來的另一種格式。實際上沒有爲此設計的語言,所以我會說使用任何你最喜歡的語言。

編輯

的OP詢問多個typedef的目標。 typedef聲明擁有超過1個目標是完全合法的。例如:

typedef _SomeStruct SomeStruct, *PSomeStruct 

這會創建2個typedef名稱。

  1. SomeStruct這相當於「結構_SomeStruct」
  2. PSomeStruct這相當於「結構_SomeStruct *」
+0

謝謝,你是絕對正確的,我沒有考慮到名稱空間。我還必須更新語法來添加引用和指針。我不在乎函數指針,所以這應該是一種解脫! :-) 我不知道多個typedef目標是什麼。 – 2009-02-10 15:04:26

1

好吧,既然你顯然已經工作與/在C++上,你有沒有考慮過使用Boost.Spirit?這使您可以在C++中以內聯語言對語法進行硬編碼,作爲特定領域的語言,並在正常的C++代碼中對其進行編程。

+0

有,我有,但我覺得這是一個有點複雜(儘管我很熟悉boost庫),並需要一些時間來掌握。我希望有更多的用戶友好的方式來做我所需要的... – 2009-02-10 14:31:06