Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Пятница. Наваял для страждущих(+)

Отправлено Quasy 21 декабря 2007 г. 12:48


<pre>
программку (конечно, основа из K&R) для перевода сложных Сишных деклараций в текстовое описание.
Проверено в среде IAR.

Применение простое: в массив input[] руками записать злобную тест-декларацию и запустить. Смотреть в отладчике, в окне тестового вывода.

Папробую сейчас оттуда же передрать функцию, делающую обратное действие, но не знаю как со временем :)

///////////////////////////////////////////////////
#include <iom128.h>
#include <ina90.h>
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
///////////////////////////////////////////////////
void dcl( void );
void dirdcl( void );
int gettoken( void );
int getnext( void );
void ungetnext( void );
#define MAXTOKEN 100
int tokentype;
enum { NAME, PARENS, BRACKETS };
char token[ MAXTOKEN ];
char name[ MAXTOKEN ];
char datatype[ MAXTOKEN ];
char out[ 255 ];
///////////////////////////////////////////////////
// TEST-DECLARATION:
//char input[] = { "int f[3] " };
//char input[] = { "int (*f())()" };
//char input[] = { "int (*f[3])() " };
char input[] = { "char(*(*x[3])())[5]" };
///////////////////////////////////////////////////
int input_index;
///////////////////////////////////////////////////
void dcl(void)
{
int ns;
for( ns=0; gettoken() == '*'; ) ns++;
dirdcl();
while( ns-- > 0 ) strcat( out, " pointer to " );
}
//////////////////
void dirdcl( void )
{
int type;
if( tokentype == '(' )
{
dcl();
if( tokentype != ')' ) { printf("ERROR: expected ')'\n"); }
}
else if( tokentype == NAME )
{
strcpy( name, token );
}
else
{
printf("ERROR: expected name or (dcl)\n");
}
while(( type=gettoken()) == PARENS || type == BRACKETS )
{
if( type == PARENS )
{
strcat( out, " function, returning ");
}
else
{
strcat( out, " array " );
strcat( out, token );
strcat( out, " of " );
}
}
}
////////////////
int getnext( void )
{
char q;
q = input[ input_index ];
input_index++;
return (q);
}
////////////////
void ungetnext( void )
{
if( input_index ) input_index--;
}
///////////////////////////////////////////////////
int gettoken( void )
{
int c;
char * p = token;
while( (c=getnext()) == ' ' || c == '\t' ) ;
if( c == '(' )
{
if( (c = getnext()) == ')' )
{
strcpy( token, "()" );
tokentype = PARENS;
return (tokentype);
}
else
{
ungetnext();
tokentype = '(';
return (tokentype);
}
}//if
else if( c == '[' )
{
for( *p++ = c; (*p++ = getnext()) != ']'; ) ;
*p = '\0';
tokentype = BRACKETS;
return (tokentype);
}
else if( isalpha(c) )
{
for( *p++ = c; isalnum(c=getnext()); ) *p++ = c;
*p = '\0';
ungetnext();
tokentype = NAME;
return (tokentype);
}
else
{
tokentype = c;
return (tokentype);
}
}
///////////////////////////////////////////////////
int main(void)
{
input_index = 0;

gettoken();

strcpy( datatype, token );
out[ 0 ] = '\0';
dcl();

printf( "%s: %s %s\n", name, out, datatype );

return 0;
}
///////////////////////////////////////////////////
</pre>


Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
введите число 13:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru