Как интерпретировать decl-спецификатор в грамматике C ++

Я скопировал полную грамматику c ++ в мой генератор синтаксического анализатора, но у меня возникают проблемы при разборе объявления C ++. Как мы должны интерпретировать Децл спецификатор при разборе объявления типа указателя, как char * varname?

Используя MSDN грамматику c ++ в качестве примера http://msdn.microsoft.com/en-us/library/0aah9xbf%28v=vs.71%29.aspx:

Спецификатор таков:

decl-specifiers :
decl-specifiersopt decl-specifier
decl-specifier :
storage-class-specifier
type-specifier
fct-specifier
friend
typedef
__declspec ( extended-decl-modifier-seq )

Согласно описанию этого msdn char * lpszAppName; должен иметь спецификатор decl = «char *», имя = «lpszAppNameMsgstr «Но мой тестовый запуск показывает, что спецификатор decl должен быть голец, декларатор (то есть имя) должен быть «* lpszAppName» . Обратите внимание, что звездочка предшествует имени — НЕ СЛЕДУЕТ СЛЕДУЮЩЕМУ ключевому слову типа char. Этот результат теста кажется разумным, так как в соответствии с decl-спецификатором я не могу найти ничего, определяющего указатель, т.е. Децл-speciifer это может привести к PTR-оператор.

Я протестировал генератор синтаксического анализатора ANTLR4 с полной грамматикой c ++, скопированной из спецификации, чтобы разобрать это:

char *
testfunction(int *cx)
{
return;
}

Результирующее дерево разбора выглядит так:

разбирать дерево

Очевидно, что возвращаемый тип «char *» фактически анализируется как возвращаемый тип «char», то есть узел под спецификатором decl, в то время как * связан с именем функции, то есть узлом под декларатором. Объявление параметра (int * cx) также считается типом «int», в то время как указатель * является узлом под декларатором для cx.

Мой тест правильный? Если да, то как должна выглядеть грамматика, если мы должны поддерживать ключевые слова-модификаторы функций, специфичные для Visual C ++, такие как __cdecl, __stdcall или __fastcall, например.

char * __fastcall
testfunction(int *cx)
{
return;
}

Ясно, что синтаксис требует, чтобы символ «char *» действительно обрабатывался как тип, то есть узел под абстрактным-декларатором.

1

Решение

Рассмотрим знаменитый char* x, y; декларация. y это charне char*, Причина в том, что * относится к x только. decl-specifier действительно просто char,

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]