МЕНЮ


Фестивали и конкурсы
Семинары
Издания
О МОДНТ
Приглашения
Поздравляем

НАУЧНЫЕ РАБОТЫ


  • Инновационный менеджмент
  • Инвестиции
  • ИГП
  • Земельное право
  • Журналистика
  • Жилищное право
  • Радиоэлектроника
  • Психология
  • Программирование и комп-ры
  • Предпринимательство
  • Право
  • Политология
  • Полиграфия
  • Педагогика
  • Оккультизм и уфология
  • Начертательная геометрия
  • Бухучет управленчучет
  • Биология
  • Бизнес-план
  • Безопасность жизнедеятельности
  • Банковское дело
  • АХД экпред финансы предприятий
  • Аудит
  • Ветеринария
  • Валютные отношения
  • Бухгалтерский учет и аудит
  • Ботаника и сельское хозяйство
  • Биржевое дело
  • Банковское дело
  • Астрономия
  • Архитектура
  • Арбитражный процесс
  • Безопасность жизнедеятельности
  • Административное право
  • Авиация и космонавтика
  • Кулинария
  • Наука и техника
  • Криминология
  • Криминалистика
  • Косметология
  • Коммуникации и связь
  • Кибернетика
  • Исторические личности
  • Информатика
  • Инвестиции
  • по Зоология
  • Журналистика
  • Карта сайта
  • Конвертер программы с подмножества языка Си в Паскаль с использованием LL(1) метода синтаксического анализа (выражения)

    может быть представлен типом операндов после преобразования. При этом

    сообщение об ошибке не выдается.

    Результатом выполнения операции сложения является сумма двух

    операндов. Операнды могут быть целого или плавающего типа или один операнд

    может быть указателем, а второй - целой величиной.

    Операция вычитания (-) вычитает второй операнд из первого. Возможна

    следующая комбинация операндов:

    1. Оба операнда целого или плавающего типа.

    2. Оба операнда являются указателями на один и тот же тип.

    3. Первый операнд является указателем, а второй - целым.

    Отметим, что операции сложения и вычитания над адресами в единицах,

    отличных от длины типа, могут привести к непредсказуемым результатам.

    Логические операции

    К логическим операциям относятся операция логического И (&&) и

    операция логического ИЛИ (||). Операнды логических операций могут быть

    целого типа, плавающего типа или типа указателя, при этом в каждой операции

    могут участвовать операнды различных типов.

    Операнды логических выражений вычисляются слева направо. Если значения

    первого операнда достаточно, чтобы определить результат операции, то второй

    операнд не вычисляется.

    Логические операции не вызывают стандартных арифметических

    преобразований. Они оценивают каждый операнд с точки зрения его

    эквивалентности нулю. Результатом логической операции является 0 или 1, тип

    результата int.

    Операция логического И (&&) вырабатывает значение 1, если оба операнда

    имеют нулевые значения. Если один из операндов равен 0, то результат также

    равен 0. Если значение первого операнда равно 0, то второй операнд не

    вычисляется.

    Операция логического ИЛИ (||) выполняет над операндами операцию

    включающего ИЛИ. Она вырабатывает значение 0, если оба операнда имеют

    значение 0, если какой-либо из операндов имеет ненулевое значение, то

    результат операции равен 1. Если первый операнд имеет ненулевое значение,

    то второй операнд не вычисляется.

    Операция последовательного вычисления

    Операция последовательного вычисления обозначается запятой (,) и

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

    допустимо только одно выражение. Эта операция вычисляет два операнда слева

    направо. При выполнении операции последовательного вычисления,

    преобразование типов не производится. Операнды могут быть любых типов.

    Результат операции имеет значения и тип второго операнда. Отметим, что

    запятая может использоваться также как символ разделитель, поэтому

    необходимо по контексту различать, запятую, используемую в качестве

    разделителя или знака операции.

    Условная операция

    В языке СИ имеется одна тернарная операция - условная операция, которая

    имеет следующий формат:

    операнд-1 ? операнд-2 : операнд-3

    Операнд-1 должен быть целого или плавающего типа или быть указателем.

    Он оценивается с точки зрения его эквивалентности 0. Если операнд-1 не

    равен 0, то вычисляется операнд-2 и его значение является результатом

    операции. Если операнд-1 равен 0, то вычисляется операнд-3 и его значение

    является результатом операции. Следует отметить, что вычисляется либо

    операнд-2, либо операнд-3, но не оба. Тип результата зависит от типов

    операнда-2 и операнда-3, следующим образом.

    1. Если операнд-2 или операнд-3 имеет целый или плавающий тип (отметим, что

    их типы могут отличаться), то выполняются обычные арифметические

    преобразования. Типом результата является тип операнда после

    преобразования.

    2. Если операнд-2 и операнд-3 имеют один и тот же тип структуры,

    объединения или указателя, то тип результата будет тем же самым типом

    структуры, объединения или указателя.

    3. Если оба операнда имеют тип void, то результат имеет тип void.

    4. Если один операнд является указателем на объект любого типа, а другой

    операнд является указателем на vold, то указатель на объект преобразуется к

    указателю на vold, который и будет типом результата.

    1. Если один из операндов является указателем, а другой константным

    выражением со значением 0, то типом результата будет тип указателя.

    Операции увеличения и уменьшения

    Операции увеличения (++) и уменьшения (--) являются унарными

    операциями присваивания. Они соответственно увеличивают или уменьшают

    значения операнда на единицу. Операнд может быть целого или плавающего типа

    или типа указатель и должен быть модифицируемым. Операнд целого или

    плавающего типа увеличиваются (уменьшаются) на единицу. Тип результата

    соответствует типу операнда. Операнд адресного типа увеличивается или

    уменьшается на размер объекта, который он адресует. В языке допускается

    префиксная или постфиксная формы операций увеличения (уменьшения), поэтому

    значения выражения, использующего операции увеличения (уменьшения) зависит

    от того, какая из форм указанных операций используется.

    Если знак операции стоит перед операндом (префиксная форма записи), то

    изменение операнда происходит до его использования в выражении и

    результатом операции является увеличенное или уменьшенное значение

    операнда.

    В том случае если знак операции стоит после операнда (постфиксная

    форма записи), то операнд вначале используется для вычисления выражения, а

    затем происходит изменение операнда.

    Построение управляющих таблиц

    Определим выражение в виде БНФ для языка С\С++ и Turbo Pascal 7.0.

    С\С++:

    В::= ++i | --i | i++ | i-- | B*B | B/B | B%B | B+B | B-B | BB | B>=B

    | B П | П<> П | П>= П | П

    С\С++ Turbo Pascal 7.0

    B( (k)B B(П

    B(++i B(П=П

    B(--i B(ПП

    B(B*B B(П=П

    B(B+B B(П<>П

    B(B-B П(П+C

    B(BB П(П or C

    B(B>=B П(+C

    B(B, , =, *, /, div, mod, and, or, (, ), ,}

    Устранив цепные правила, левую рекурсию, получим LL(1)-грамматику.

    C\C++

    1. B(i B1

    2. B1(= BB’

    3. B1(*=BB’

    4. B1(+=BB’

    5. B1(-BB’

    6. B1(/BB’

    7. B1(--B’

    8. B1(++B’

    9. B1((SS1

    10. S1()B’

    11. B((B2

    12. B2(i B1C

    13. C()B’

    14. B2((B2C

    15. B2(--C1 C

    16. C1(i B’

    17. B2(++C1 C

    18. B2(k C2

    19. C2()BB’

    20. B(--C1

    21. B(++C1

    22. B1(%BB’

    23. B1(*BB’

    24. B1(/BB’

    25. B1(+BB’

    26. B1(-BB’

    27. B1(>BB’

    28. B1(=BB’

    31. B1(==BB’

    32. B1(!=BB’

    33. B1(&&BB’

    34. B1(||BB’

    35. B1(?BB3

    36. B3(:BB’

    37. B1($

    38. B’(%BB’

    39. B’(*BB’

    40. B’(/BB’

    41. B’(+BB’

    42. B’(-BB’

    43. B’(>BB’

    44. B’(=BB’

    46. B’(П

    8. B’(<>П

    9. B’(>=П

    10. B’(= | | |30 | | |45 | | | | | | |

    |> | | |27 | | |43 | | | | | | |

    |< | | |28 | | |44 | | | | | | |

    |- | | |26 | | |42 | | | | | | |

    |+ | | |25 | | |41 | | | | | | |

    |/ | | |24 | | |40 | | | | | | |

    |* | | |23 | | |39 | | | | | | |

    |% | | |22 | | |38 | | | | | | |

    |-- |56 |20 |7 |15 | | | | | | | | |

    |++ |57 |21 |8 |17 | | | | | | | | |

    |K | | | |18 | | | | | | | | |

    |I |54 |1 | |12 | | | |16 | | | | |

    |) | | |37 | | |53 |13 | |19 |59 |10 | |

    |( |55 |11 |9 |14 | | | | | | | | |

    | |S |B |B1 |B2 |B3 |B’ |C |C1 |C2 |S’ |S1 |# |

    Управляющая таблица для выражения на языке Turbo Pascal 7.0

    ||- | | |11 | |32 | |23 | | |19 |38 |39 |

    |Or | | | | |32 | |23 | | |18 | | |

    |= | | |9 | |32 | |23 | | |19 | | |

    |> | | |7 | |32 | |23 | | |19 | | |

    |< | | |6 | |32 | |23 | | |19 | | |

    |<> | | |8 | |32 | |23 | | |19 | | |

    |= | | |5 | |32 | |23 | | |19 | | |

    |And | | | | |31 | |23 | | | | | |

    |Mod | | | | |30 | |23 | | | | | |

    |Div | | | | |29 | |23 | | | | | |

    |/ | | | | |28 | |23 | | | | | |

    |* | | | | |27 | |23 | | | | | |

    |- |34 |2 | | |32 | |23 | |13 |17 | | |

    |+ |33 |1 | | |32 | |23 | |12 |16 | | |

    |, | | |11 | |32 | |23 | | |19 |37 | |

    |I |35 |3 | |25 | |20 | | |14 | | | |

    |) | | |11 | |32 | |23 |24 | |19 |38 | |

    |( |36 |4 | |26 | |21 |22 | |15 | | | |

    | |S |B |B’ |C |C’ |M |M’ |M1 |П |П’ |S’ |# |

    Пример работы программы

    Ввели выражение на языке СИ:

    КУРСОВАЯ РАБОТА ПО ЯПМТ

    Выберете язык: 1 - СИ\СИ++ 2 - Turbo Pascal 7.0

    1

    Напишите выражение на языке С:

    (e+e==7)

    Дескрипторный текст:

    0 2 9 2 16 2 1

    Заменить(S',В2) Сдвиг

    Заменить(C,В1) Сдвиг

    Заменить(В',В) Сдвиг

    Заменить(В1) Сдвиг

    Заменить(В',В) Сдвиг

    Заменить(В1) Сдвиг

    Вытолкнуть Держать

    Вытолкнуть Держать

    Вытолкнуть Держать

    Заменить(В') Сдвиг

    Вытолкнуть Держать

    Вытолкнуть Держать

    ДОПУСТИТЬ

    Выходная лента:

    55 12 25 1 31 1 37 53 53 13 53 59 60

    Ввели не выражение:

    КУРСОВАЯ РАБОТА ПО ЯПМТ

    Выберете язык: 1 - СИ\СИ++ 2 - Turbo Pascal 7.0

    1

    Напишите выражение на языке С:

    t+

    Дескрипторный текст:

    2 9

    Заменить(S',В1) Сдвиг

    Заменить(В',В) Сдвиг

    Отвергнуть

    Выходная лента:

    54 25 0

    Ввели выражение на Паскале:

    КУРСОВАЯ РАБОТА ПО ЯПМТ

    Выберете язык: 1 - СИ\СИ++ 2 - Turbo Pascal 7.0

    2

    Напишите выражение на языке TP:

    ww=s+1

    Дескрипторный текст:

    2 11 2 4 2

    Заменить(В'П'C'M') Сдвиг

    Вытолкнуть Держать

    Вытолкнуть Держать

    Вытолкнуть Держать

    Заменить(П) Сдвиг

    Заменить(П'C'M') Сдвиг

    Вытолкнуть Держать

    Вытолкнуть Держать

    Заменить(П'C) Сдвиг

    Заменить(C'M') Сдвиг

    Вытолкнуть Держать

    Вытолкнуть Держать

    Вытолкнуть Держать

    ДОПУСТИТЬ

    Выходная лента:

    3 23 32 19 5 14 23 32 16 25 23 32 19 39

    Ввели не выражение

    КУРСОВАЯ РАБОТА ПО ЯПМТ

    Выберете язык: 1 - СИ\СИ++ 2 - Turbo Pascal 7.0

    2

    Напишите выражение на языке TP:

    f=s+

    Дескрипторный текст:

    2 11 2 4

    Заменить(В'П'C'M') Сдвиг

    Вытолкнуть Держать

    Вытолкнуть Держать

    Вытолкнуть Держать

    Заменить(П) Сдвиг

    Заменить(П'C'M') Сдвиг

    Вытолкнуть Держать

    Вытолкнуть Держать

    Заменить(П'C) Сдвиг

    Отвергнуть

    Выходная лента:

    3 23 32 19 5 14 23 32 16 0

    Листинг программы:

    #include

    #include

    #define n 100

    #define t 17

    #define m 53

    #define g 11

    char s1[n],s[n],a[n];

    int j=0,h,vl[n],y=0;

    /*---------------------------ВВОД ВЫРАЖЕНИЯ------------------------------*/

    int vvod()

    {

    int i;

    printf("\t\t\tКУРСОВАЯ РАБОТА ПО ЯПМТ\n");

    printf("Выберете язык: 1 - СИ\\СИ++ 2 - Turbo Pascal 7.0\n");

    scanf("%d",&y);

    if(y==1)

    printf("Напишите выражение на языке С:\n");

    {for(i=0;i': if(s1[i+1]=='='){a[w]=13;i++;}else a[w]=12;break;

    case '': if(s1[i+1]=='='){a[w]=15;i++;}else a[w]=14;break;

    case '<': if(s1[i+1]=='='){a[w]=16;i++;}else a[w]=13;break;

    case '+': a[w]=4;break;

    case '-': a[w]=5;break;

    case ',': a[w]=3;break;

    case 'd': if(s1[i+1]=='i'&&s1[i+2]=='v')a[w]=8;i++;i++;break;

    case 'm': if(s1[i+1]=='o'&&s1[i+2]=='d')a[w]=9;i++;i++;break;

    case 'a': if(s1[i+1]=='n'&&s1[i+2]=='d')a[w]=10;i++;i++;break;

    case 'o': if(s1[i+1]=='r')a[w]=17;i++;break;

    }

    i++;

    }

    else

    {

    i1=i;

    while(di!=1)

    {

    i++;

    di=termin(s1[i]);

    }

    q=perem(i1,i-1);

    if(q==1)a[w]=2;else

    {printf("ERROR.\nЛЕКСИЧЕСКАЯ ОШИБКА");break;}

    }

    printf("%d ",a[w]);

    w++;

    }

    while(s1[i]!='\n');

    a[w]=18;

    };

    int analiz1()

    {

    int z[10],v,z1,i(0),j,k;

    int tab[12][19]={{36,0,35,0,33,34,0,0,0,0,0,0,0,0,0,0,0,0,0},

    {4,0,3,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0},

    {0,11,0,11,0,0,0,0,0,0,0,5,8,6,7,9,10,0,11},

    {26,0,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

    {0,32,0,32,32,32,27,28,29,30,31,32,32,32,32,32,32,32,32},

    {21,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

    {22,23,0,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23},

    {0,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

    {15,0,14,0,12,13,0,0,0,0,0,0,0,0,0,0,0,0,0},

    {0,19,0,19,16,17,0,0,0,0,0,19,19,19,19,19,19,18,19},

    {0,38,0,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38},

    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39}};

    printf("\n");

    z1=0;

    z[z1]=11;z1++;z[z1]=1;

    v=0;j=0;

    do

    {

    switch(tab[z[z1]][a[v]])

    {

    case 1: z[z1]=2;z1++;z[z1]=9;z1++;z[z1]=3;v++;

    printf("\tЗаменить(В'П'C)\tСдвиг\n");vl[j]=1;break;

    case 2: z[z1]=2;z1++;z[z1]=9;z1++;z[z1]=3;v++;

    printf("\tЗаменить(В'П'C)\tСдвиг\n");vl[j]=2;break;

    case 3: z[z1]=2;z1++;z[z1]=9;z1++;z[z1]=4;z1++;z[z1]=6;v++;

    printf("\tЗаменить(В'П'C'M')\tСдвиг\n");vl[j]=3;break;

    case 4:

    z[z1]=2;z1++;z[z1]=9;z1++;z[z1]=4;z1++;z[z1]=7;z1++;z[z1]=1;v++;

    printf("\tЗаменить(В'П'C'M1,B)\tСдвиг\n");vl[j]=4;break;

    case 5: z[z1]=8;v++;

    printf("\tЗаменить(П)\tСдвиг\n");vl[j]=5;break;

    case 6: z[z1]=8;v++;

    printf("\tЗаменить(П)\tСдвиг\n");vl[j]=6;break;

    case 7: z[z1]=8;v++;

    printf("\tЗаменить(П)\tСдвиг\n");vl[j]=7;break;

    case 8: z[z1]=8;v++;

    printf("\tЗаменить(П)\tСдвиг\n");vl[j]=8;break;

    case 9: z[z1]=8;v++;

    printf("\tЗаменить(П)\tСдвиг\n");vl[j]=9;break;

    case 10:z[z1]=8;v++;

    printf("\tЗаменить(П)\tСдвиг\n");vl[j]=10;break;

    case 11:z1--;

    printf("\tВытолкнуть\tДержать\n");vl[j]=11;break;

    case 12:z[z1]=9;z1++;z[z1]=3;v++;

    printf("\tЗаменить(П'C)\tСдвиг\n");vl[j]=12;break;

    case 13:z[z1]=9;z1++;z[z1]=3;v++;

    printf("\tЗаменить(П'C)\tСдвиг\n");vl[j]=13;break;

    case 14:z[z1]=9;z1++;z[z1]=4;z1++;z[z1]=6;v++;

    printf("\tЗаменить(П'C'M')\tСдвиг\n");vl[j]=14;break;

    case 15:z[z1]=9;z1++;z[z1]=4;z1++;z[z1]=7;v++;

    printf("\tЗаменить(П'C'M1,B)\tСдвиг\n");vl[j]=15;break;

    case 16:z[z1]=9;z1++;z[z1]=3;v++;

    printf("\tЗаменить(П'C)\tСдвиг\n");vl[j]=16;break;

    case 17:z[z1]=9;z1++;z[z1]=3;v++;

    printf("\tЗаменить(П'C)\tСдвиг\n");vl[j]=17;break;

    case 18:z[z1]=9;z1++;z[z1]=3;v++;

    printf("\tЗаменить(П'C)\tСдвиг\n");vl[j]=18;break;

    case 19:z1--;

    printf("\tВытолкнуть\tДержать\n");vl[j]=19;break;

    case 20:z[z1]=6;v++;

    printf("\tЗаменить(M')\tСдвиг\n");vl[j]=20;break;

    case 21:z[z1]=7;z1++;z[z1]=1;v++;

    printf("\tЗаменить(M1,B)\tСдвиг\n");vl[j]=21;break;

    case 22:z[z1]=7;z1++;z[z1]=0;v++;

    printf("\tЗаменить(M1,S)\tСдвиг\n");vl[j]=22;break;

    case 23:z1--;

    printf("\tВытолкнуть\tДержать\n");vl[j]=23;break;

    case 24:z1--;v++;

    printf("\tВытолкнуть\tСдвиг\n");vl[j]=24;break;

    case 25:z[z1]=4;z1++;z[z1]=6;v++;

    printf("\tЗаменить(C'M')\tСдвиг\n");vl[j]=25;break;

    case 26:z[z1]=4;z1++;z[z1]=6;z1++;z[z1]=1;v++;

    printf("\tЗаменить(C'M'B)\tСдвиг\n");vl[j]=26;break;

    case 27:z[z1]=4;z1++;z[z1]=6;v++;

    printf("\tЗаменить(C'M')\tСдвиг\n");vl[j]=27;break;

    case 28:z[z1]=4;z1++;z[z1]=6;v++;

    printf("\tЗаменить(C'M')\tСдвиг\n");vl[j]=28;break;

    case 29:z[z1]=4;z1++;z[z1]=5;v++;

    printf("\tЗаменить(C'M)\tСдвиг\n");vl[j]=29;break;

    case 30:z[z1]=4;z1++;z[z1]=5;v++;

    printf("\tЗаменить(C'M)\tСдвиг\n");vl[j]=30;break;

    case 31:z[z1]=4;z1++;z[z1]=5;v++;

    printf("\tЗаменить(C'M)\tСдвиг\n");vl[j]=31;break;

    case 32:z1--;

    printf("\tВытолкнуть\tДержать\n");vl[j]=32;break;

    case 33:z[z1]=10;z1++;z[z1]=2;z1++;z[z1]=9;z1++;z[z1]=3;v++;

    printf("\tЗаменить(S'B'П'С)\tСдвиг\n");vl[j]=33;break;

    case 34:z[z1]=10;z1++;z[z1]=2;z1++;z[z1]=9;z1++;z[z1]=3;v++;

    printf("\tЗаменить(S'B'П'С)\tСдвиг\n");vl[j]=34;break;

    case

    35:z[z1]=10;z1++;z[z1]=2;z1++;z[z1]=9;z1++;z[z1]=4;z1++;z[z1]=6;v++;

    printf("\tЗаменить(S'B'П'С'M')\tСдвиг\n");vl[j]=35;break;

    case

    36:z[z1]=2;z1++;z[z1]=9;z1++;z[z1]=4;z1++;z[z1]=7;z1++;z[z1]=1;v++;

    printf("\tЗаменить(B'П'С'M1,B)\tСдвиг\n");vl[j]=36;break;

    case 37:z[z1]=0;v++;

    printf("\tЗаменить(S)\tСдвиг\n");vl[j]=37;break;

    case 38:z1--;

    printf("\tВытолкнуть\tДержать\n");vl[j]=38;break;

    case 39: printf("ДОПУСТИТЬ\n");i=1;vl[j]=39;break;

    case 0: printf("Отвергнуть\n");i=2;vl[j]=0;break;

    }

    if(i==1|i==2)break;else j++;

    }

    while(tab[z[z1]][a[v]]!=0||tab[z[z1]][a[v]]!=39);

    printf("Выходная лента:\n");

    for(k=0;k<=j;k++)

    {

    printf("%d ",vl[k]);

    }

    return i;

    };

    /*--------------------------УДАЛЕНИЕ ПРОБЕЛОВ-------------------------------

    --------*/

    /*int probel()

    {

    int i(0),k(0);

    for(i=0;i<=j-1;i++)

    {

    if(s[i]!=' '){s1[k]=s[i];k++;}

    }

    j=k;

    };*/

    /*-------------------------------------------------------------------------

    */

    int main()

    {

    int w,i;

    clrscr();

    //probel();

    y=vvod();

    w=0;

    a[w]=0;

    if(y==1)

    {lexica();

    i=analiz();}

    if(y==2)

    {

    lexica1();

    i=analiz1();

    }

    getch();

    return 0;

    }

    Страницы: 1, 2


    Приглашения

    09.12.2013 - 16.12.2013

    Международный конкурс хореографического искусства в рамках Международного фестиваля искусств «РОЖДЕСТВЕНСКАЯ АНДОРРА»

    09.12.2013 - 16.12.2013

    Международный конкурс хорового искусства в АНДОРРЕ «РОЖДЕСТВЕНСКАЯ АНДОРРА»




    Copyright © 2012 г.
    При использовании материалов - ссылка на сайт обязательна.