Я скопировал полную грамматику 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 *» действительно обрабатывался как тип, то есть узел под абстрактным-декларатором.
Рассмотрим знаменитый char* x, y;
декларация. y
это char
не char*
, Причина в том, что *
относится к x
только. decl-specifier
действительно просто char
,
Других решений пока нет …