我想解析简单的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;
答案 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 ';'
你的语法也遗漏了以下案例
解析语法(我喜欢讽刺)是一个相当直接的操作。如果你想以功能的方式实际使用语法,我会说最好的选择是lex / yacc组合。
但是从您的问题看来,您似乎想将其吐出到另一种格式。实际上没有为此设计的语言所以我会说使用你最熟悉的语言。
修改强>
OP询问了多个typedef目标。对于typedef声明来说,拥有多个目标是完全合法的。例如:
typedef _SomeStruct SomeStruct, *PSomeStruct
这会创建2个typedef名称。