Как вы можете разобрать простые инструкции C ++ typedef? - PullRequest
1 голос
/ 10 февраля 2009

Я бы хотел разобрать простые инструкции 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 ]

1 голос
/ 10 февраля 2009

Я бы немного изменил грамматику

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.

Но из вашего вопроса видно, что вы хотите выплюнуть его в другой формат. На самом деле не существует языка, разработанного для этого, поэтому я бы сказал, используйте тот язык, который вам наиболее удобен.

Редактировать

ОП спросил о нескольких целях typedef. Для объявления typedef вполне законно иметь более 1 цели. Например:

typedef _SomeStruct SomeStruct, *PSomeStruct

Это создает 2 имени типа определения.

  1. SomeStruct, который эквивалентен "struct _SomeStruct"
  2. PSomeStruct, который эквивалентен "struct _SomeStruct *"
1 голос
/ 10 февраля 2009

Ну, так как вы, очевидно, уже работаете с / на C ++, вы рассматривали возможность использования Boost.Spirit ? Это позволяет вам жестко кодировать встроенную грамматику в C ++ как предметно-ориентированный язык и программировать ее в обычном коде C ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...