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

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

Вот и обратное преобразование(+)

Отправлено Quasy 21 декабря 2007 г. 15:34
В ответ на: Угу. Но здесь и без тэгов ОК. отправлено <font color=gray>Quasy</font> 21 декабря 2007 г. 13:13


из слов в Сишную конструкцию...
Во входной массив input[] писать "словесное" описание при помощи
Сишных определений [], (), *. По человечески, слева направо, как мы говорим. В КОНЕЦ СТРОКИ ДОБАВЛЯТЬ \n
Например, "x [ 3 ] char\n" == x есть массив из 3-х char.
Или "x () * char\n" == x есть функция, возвращающая указатель на char
Только внутрь скобок, обозначающих "функцию", не пишите ничего.
Просто () и все.
Все должно быть понятно по тестовым примерам.

// Перевод текстового описания в Сишную декларацию
// Входную декларацию писать в массив input[]
///////////////////////////////////////////////////
#include <iom128.h>
#include <ina90.h>
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
///////////////////////////////////////////////////
int gettoken( void );
int getnext( void );
#define MAXTOKEN 100
int tokentype;
enum { NAME, PARENS, BRACKETS };
char token[ MAXTOKEN ];
char out[ 255 ];
char temp[ MAXTOKEN ];
///////////////////////////////////////////////////
// TEST-DECLARATION:

// TEST 1:
// x: function, returning pointer to array [3] of pointer to
// function, returning char. Возвратится: "char (*(*x())[3])()"
//char input[] = {"x () * [3] * () char\n"};

// TEST 2:
// f: function, returning pointer to function, returning int.
// Возвратится: "int (*f())()"
//char input[] = { "f () * () int\n" };

// TEST3:
// x: array [3] of pointer to function, returning pointer to
// array [5] of char. Возвратится: "char(*(*x[3])())[5]"
//char input[] = {"x [3] * () * [5] char\n "};

// TEST 4:
// f: array [3] of pointer to function, returning int
// Возвратится: "int (*f[3])() "
char input[] = { "f [ 3 ] * () int\n" };

///////////////////////////////////////////////////
int input_index;
///////////////////////////////////////////////////
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)
{
int type;

input_index = 0;

gettoken();

strcpy( out, token );

while(( type=gettoken()) != '\n')
{
if( (type == PARENS) || (type == BRACKETS) )
{
strcat(out, token);
}
else if( type == '*' )
{
sprintf( temp, "(*%s)", out );
strcpy( out, temp );
}
else if( type == NAME )
{
sprintf( temp, "%s %s", token, out );
strcpy( out, temp );
}
else
{
printf("ERROR: Element %s of term\n", token);
}
}
printf("%s\n", out );

return 0;
}


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

Ответы


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

Сообщение:

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

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

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

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