Міністерство освіти і науки України
Національний університет ”Львівська політехніка”
ЛАБОРАТОРНА РОБОТА №2
на тему : “Синтаксичний аналіз,,
Тема: Синтаксичний аналіз
Мета: Побудувати граматику, яка породжує запропоновану підмножину мови програмування, визначити типи можливих помилок та форму відповідного повідомлення . Написати програму синтаксичного контролю метором рекурсивного ( низхідний аналіз спуску), попередньо застосувавши еквівалентні перетворення граматики (якщо потрібно).
При потребі внести доповнення у підпрограму лексичного аналізу.
Варіант №3
Завдання:
Розглянути підмножину мови Pascal, у якій є ідентифікатори символів), цілі константи, які використовуються у операторах опису (типи змінних – real , integer), оператори присвоєння , умовні оператори (коротка форма, умова – одна операція порівняння або декілька порівнянь, об’єднаних за допомогою логічних операцій).
Код програми:
#include "stdafx.h"
# include <stdio.h>
# include <string>
# include <iostream>
# define lexsize 30
using namespace std;
char lit, syn, lex[lexsize];
int cl, i;
FILE *fr, *fw;
void getlit(void);
void scan(void);
void main(void)
{
fr=fopen("1.txt", "r");
fw=fopen("2.txt", "w");
lit=' ';
while (!feof(fr))
{ scan();
if ((lit!=' ')&&(lit!='\n')&&(lit!='\t'))
fprintf (fw, "%c\t%s\n", syn, lex); }
fclose (fr); fclose (fw);
}
void scan(void)
{
i=0;
while ((lit==' ')||(lit=='\n')||(lit=='\t')) {getlit( ); if(feof)return;}
switch(cl)
{ case 1: lex[i++]=lit; getlit(); while(cl<=2) {lex[i++]=lit; getlit(); }
lex[i]='\0';
if (i<=10)
if (strcmp(lex,"begin")==0) syn='B';
else if (strcmp(lex,"end")==0) syn='E';
else if (strcmp(lex,"if")==0) syn='W';
else if (strcmp(lex,"then")==0) syn='D';
else if (strcmp(lex,"real")==0) syn='R';
else if (strcmp(lex,"integer")==0) syn='I';
else if (strcmp(lex,"or")==0) syn='O';
else if (strcmp(lex,"and")==0) syn='A';
else if (strcmp(lex,"not")==0) syn='N';
else if (strcmp(lex,"var")==0) syn='V';
else if (strcmp(lex,"program")==0) syn='P';
else syn='i';
else syn='e';
break;
case 2: lex[i++]=lit; getlit(); while(cl==2) {lex[i++]=lit; getlit(); }
lex[i]='\0';
if (i<=10) syn='c';
else syn='e';
break;
case 3: lex[i++]=lit; lex[i++]='\0'; syn=lit; getlit(); break;
case 4: lex[i++]=lit; syn=lit; getlit();
if (lit=='=') { lex[i++]=lit; syn='p'; getlit();}
lex[i++]='\0';
break;
case 5: lex[i++]=lit; syn='n'; getlit();
if (lit=='>'||lit=='=') {lex[i++]=lit; getlit(); }
lex[i++]='\0';
break;
case 6: lex[i++]=lit; syn='n'; getlit();
if (lit=='=') {lex[i++]=lit; getlit(); }
lex[i++]='\0';
break;
case 7: lex[0]=lit; lex[1]='\0'; syn='n'; getlit(); break;
default: lex[0]=lit; lex[1]='\0'; syn='e'; getlit(); break; }
}
void getlit(void)
{ lit=fgetc(fr); cl=8;
if (( lit>='a')&& ( lit<='z')|| ( lit>='A')&& ( lit<='Z'))cl=1;
if (( lit>='0')&& ( lit<='9'))cl=2;
if ((lit=='(')||( lit==')')|| ( lit==';')||( lit==',')||(lit=='+')|| ( lit=='-')||
( lit=='*')||(lit=='/'))cl=3;
if ( lit==':')cl=4;
if ( lit=='<')cl=5;
if ( lit=='>')cl=6;
if ( lit=='=')cl=7;
}
Приклади:
Висновок: на цій лабораторній роботі я навчилась будувати граматику, яка породжує запропоновану підмножину мови програмування, визначати типи можливих помилок та форму відповідного повідомлення ,складати програму синтаксичного контролю метором рекурсивного ( низхідний аналіз спуску), попередньо застосувавши еквівалентні перетворення граматики (якщо потрібно).