你如何解析简单的C ++ typedef指令?

时间:2009-02-10 14:25:34

标签: c++ parsing

我想解析简单的C ++ typedef指令,例如

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

我已经编写了我希望在解析时使用的相应语法。

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

一旦解析了这个,我所要做的就是用相同的信息生成xml(但是以不同的方式排列)

编写此类程序最有效的语言是什么? 你怎么能做到这一点?

编辑:我使用Boost Spirit提出了什么(它并不完美,但对我来说这已经足够了,至少目前是这样)

   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;

2 个答案:

答案 0 :(得分:1)

好吧,既然您显然已经在使用C ++,那么您是否考虑过使用Boost.Spirit?这允许您在C ++中将语法硬编码为特定于域的语言,并在正常的C ++代码中对其进行编程。

答案 1 :(得分: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. 功能指针(这是迄今为止最困难的)
  4. 解析语法(我喜欢讽刺)是一个相当直接的操作。如果你想以功能的方式实际使用语法,我会说最好的选择是lex / yacc组合。

    但是从您的问题看来,您似乎想将其吐出到另一种格式。实际上没有为此设计的语言所以我会说使用你最熟悉的语言。

    修改

    OP询问了多个typedef目标。对于typedef声明来说,拥有多个目标是完全合法的。例如:

    typedef _SomeStruct SomeStruct, *PSomeStruct
    

    这会创建2个typedef名称。

    1. SomeStruct,相当于“struct _SomeStruct”
    2. PSomeStruct,相当于“struct _SomeStruct *”