Ìèíèñòåðñòâî íàóêè, âûñøåé øêîëû è òåõíè÷åñêîé ïîëèòèêè Ðîññèéñêîé Ôåäåðàöèè.
Íîâîñèáèðñêèé Ãîñóäàðñòâåííûé Òåõíè÷åñêèé Óíèâåðñèòåò.
Êóðñîâàÿ ðàáîòà ïî ñèñòåìíîìó ïðîãðàììèðîâàíèþ.
Ñèíòàêñè÷åñêèé ðàñïîçíàâàòåëü àðèôìåòè÷åñêîãî îïåðàòîðà óñëîâíîãî ïåðåõîäà ÿçûêà FORTRAN.
Ôàêóëüòåò: ÀÂÒ.
Êàôåäðà: ÀÑÓ.
Ãðóïïà: À–513.
Ñòóäåíò: Áîéêî Êîíñòàíòèí Àíàòîëüåâè÷.
Ïðåïîäàâàòåëü: Øîðíèêîâ Þðèé Âëàäèìèðîâè÷.
Àññèñòåíò: Ïàíîâà Âåðà Áîðèñîâíà.
Äàòà: 30 àïðåëÿ 1997 ã.
Îòìåòêà î çàùèòå:
Íîâîñèáèðñê.
ßçûê îïåðàòîðà.
ßçûê àðèôìåòè÷åñêîãî îïåðàòîðà óñëîâíîãî ïåðåõîäà ÿçûêà FORTRAN.
IF(<ÀÂ>) LABEL1,LABEL2,LABEL3
À - Àðèôìåòè÷åñêîå Âûðàæåíèå.
LABEL1,LABEL2,LABEL3 - ïåðâàÿ, âòîðàÿ è òðåòüÿ ìåòêè
ñîîòâåòñòâåííî.
Ãðàììàòèêà ÿçûêà.
G[<Îïåðàòîð>]:
1. <Îïåðàòîð> ® IF(<ÀÂ>)<LABEL>,<LABEL>,<LABEL>
2. <LABEL> ® <ÖÁÇ>
3. <ÀÂ> ® T | <ÀÂ>+T | <ÀÂ>-T
4. T ® O | T*O | T/O | T**O
5. O ® (<ÀÂ>) | <Èäåíòèôèêàòîð> | <×ÏÇ>
6. <Èäåíòèôèêàòîð> ® Á{Á|Ö}
7. <ÖÁÇ> ® Ö{Ö}[L]
8. <×ÏÇ> ® Ö{Ö}[.Ö{Ö}]
Óñëîâíûå îáîçíà÷åíèÿ:
Ò |
– |
ÒÅÐÌ. |
Î |
– |
ÎÏÅÐÀÍÄ. |
Á |
– |
ÁÓÊÂÀ. |
Ö |
– |
ÖÈÔÐÀ. |
ÖÁÇ |
– |
ÖÅËÎÅ ÁÅÇ ÇÍÀÊÀ. |
** |
– |
ÂÎÇÂÅÄÅÍÈÅ Â ÑÒÅÏÅÍÜ. |
LABEL |
– |
ÌÅÒÊÀ. |
×ÏÇ |
– |
×ÈÑËÎ Ñ ÏËÀÂÀÞÙÅÉ ÇÀÏßÒÎÉ. |
L |
– |
ÊÎÍÅÖ ÑÒÐÎÊÈ (ïóñòî). |
ÀÂ |
– |
ÀÐÈÔÌÅÒÈ×ÅÑÊÎÅ ÂÛÐÀÆÅÍÈÅ. |
Êëàññèôèêàöèÿ ãðàììàòèêè.
Äàííàÿ ãðàììàòèêà G[<ÎÏÅÐÀÒÎÐ>], ñîãëàñíî êëàññèôèêàöèè Õîìñêîãî, ÿâëÿåòñÿ êîíòåêñòíî-ñâîáîäíîé, òàê êàê ïðàâàÿ ÷àñòü êàæäîé ðåäóêöèè íà÷èíàåòñÿ ëèáî ñ òåðìèíàëüíîãî ñèìâîëà, ëèáî ñ íåòåðìèíàëüíîãî, ïðèíàäëåæàùåãî îáúåäèí¸ííîìó ñëîâàðþ.
A ® a, AÎVn, aÎV*.
Ãðàììàòèêà G[<ÎÏÅÐÀÒÎÐ>] íå ÿâëÿåòñÿ àâòîìàòíîé, òàê êàê íå âñå å¸ ðåäóêöèè íà÷èíàþòñÿ ñ òåðìèíàëüíîãî ñèìâîëà. Ïî ýòîé æå ïðè÷èíå äàííàÿ ãðàììàòèêà íå ÿâëÿåòñÿ S - ãðàììàòèêîé.
Ìåòîä àíàëèçà.
Äëÿ äàííîé ãðàììàòèêè ðåàëèçîâàí ðàçáîð ìåòîäîì ðåêóðñèâíîãî ñïóñêà, ïîñêîëüêó îíà îòíîñèòñÿ ê êëàññó êîíòåêñòíî-ñâîáîäíûõ.
Èäåÿ ìåòîäà ñîñòîèò â òîì, ÷òî êàæäîìó íåòåðìèíàëüíîìó ñèìâîëó ñòàâèòñÿ â ñîîòâåòñòâèå îïðåäåë¸ííàÿ ïðîãðàììíàÿ åäèíèöà (ôóíêöèÿ), êîòîðàÿ ðàñïîçíà¸ò öåïî÷êó, ïîðîæäàåìóþ ýòèì íåòåðìèíàëîì.
Ýòè ïðîöåäóðû è ôóíêöèè âûçûâàþòñÿ â ñîîòâåòñòâèè ñ ïðàâèëàìè ãðàììàòèêè è èíîãäà âûçûâàþò ñàìè ñåáÿ.
Äàííûé ìåòîä ðåàëèçîâàí íà ÿçûêå C++, ïîñêîëüêó îí îáëàäàåò ðåêóðñèâíûìè âîçìîæíîñòÿìè.
Äèàãíîñòèêà è íåéòðàëèçàöèÿ îøèáîê.
Äëÿ äàííîé ãðàììàòèêè ïðîèçâîäèòñÿ òîëüêî äèàãíîñòèêà è íåéòðàëèçàöèÿ îøèáîê. Èñïðàâëåíèå îøèáîê íå ïðîèçâîäèòñÿ.
Íåéòðàëèçàöèÿ îøèáîê îñóùåñòâëÿåòñÿ ïî ìåòîäó Àéðîíñà, òî åñòü, ñïóñêàÿñü ïî ñèíòàêñè÷åñêîìó äåðåâó áåç âîçâðàòà ïî êîíòåêñòó, ïðè îáíàðóæåíèè òóïèêîâîé ñèòóàöèè îòáðàñûâàþòñÿ òå ëèòåðû (ñèìâîëû), êîòîðûå ïðèâåëè â òóïèêîâóþ ñèòóàöèþ è ðàçáîð ïðîäîëæàåòñÿ.
Òåñòèðîâàíèå.
¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
IF(((6/t+g*456)/(9.347*y-555))**6) 64,44,548
¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
Òåêóùèé ñèìâîë ( - 40.
AB - Ïðîâåðêà íà Àðèôìåòè÷åñêîå Âûðàæåíèå.
Òåêóùèé ñèìâîë ( - 40.
Term - Ïðîâåðêà íà Òåðì.
Operand - Ïðîâåðêà íà Îïåðàíä.
AB - Ïðîâåðêà íà Àðèôìåòè÷åñêîå Âûðàæåíèå.
Òåêóùèé ñèìâîë ( - 40.
Term - Ïðîâåðêà íà Òåðì.
Operand - Ïðîâåðêà íà Îïåðàíä.
AB - Ïðîâåðêà íà Àðèôìåòè÷åñêîå Âûðàæåíèå.
Òåêóùèé ñèìâîë 6 - 54.
Term - Ïðîâåðêà íà Òåðì.
Operand - Ïðîâåðêà íà Îïåðàíä.
IDENT - Ïðîâåðêà íà Èäåíòèôèêàòîð ñ ñèìâîëà 6.
FLOAT - ïðîâåðêà íà ÷èñëî ñ ïëàâàþùåé çàïÿòîé ñ öèôðû 6.
Òåêóùèé ñèìâîë / - 47.
Òåêóùèé ñèìâîë t - 116.
Term - Ïðîâåðêà íà Òåðì.
Operand - Ïðîâåðêà íà Îïåðàíä.
IDENT - Ïðîâåðêà íà Èäåíòèôèêàòîð ñ ñèìâîëà t.
Òåêóùèé ñèìâîë + - 43.
AB - Ïðîâåðêà íà Àðèôìåòè÷åñêîå Âûðàæåíèå.
Òåêóùèé ñèìâîë g - 103.
Term - Ïðîâåðêà íà Òåðì.
Operand - Ïðîâåðêà íà Îïåðàíä.
IDENT - Ïðîâåðêà íà Èäåíòèôèêàòîð ñ ñèìâîëà g.
Òåêóùèé ñèìâîë * - 42.
Òåêóùèé ñèìâîë 4 - 52.
Term - Ïðîâåðêà íà Òåðì.
Operand - Ïðîâåðêà íà Îïåðàíä.
IDENT - Ïðîâåðêà íà Èäåíòèôèêàòîð ñ ñèìâîëà 4.
FLOAT - ïðîâåðêà íà ÷èñëî ñ ïëàâàþùåé çàïÿòîé ñ öèôðû 4.
Òåêóùèé ñèìâîë 5 - 53.
Òåêóùèé ñèìâîë 6 - 54.
Òåêóùèé ñèìâîë ) - 41.
Òåêóùèé ñèìâîë / - 47.
Òåêóùèé ñèìâîë ( - 40.
Term - Ïðîâåðêà íà Òåðì.
Operand - Ïðîâåðêà íà Îïåðàíä.
AB - Ïðîâåðêà íà Àðèôìåòè÷åñêîå Âûðàæåíèå.
Òåêóùèé ñèìâîë 9 - 57.
Term - Ïðîâåðêà íà Òåðì.
Operand - Ïðîâåðêà íà Îïåðàíä.
IDENT - Ïðîâåðêà íà Èäåíòèôèêàòîð ñ ñèìâîëà 9.
FLOAT - ïðîâåðêà íà ÷èñëî ñ ïëàâàþùåé çàïÿòîé ñ öèôðû 9.
Òåêóùèé ñèìâîë . - 46.
Òåêóùèé ñèìâîë 3 - 51.
Òåêóùèé ñèìâîë 4 - 52.
Òåêóùèé ñèìâîë 7 - 55.
Òåêóùèé ñèìâîë * - 42.
Òåêóùèé ñèìâîë y - 121.
Term - Ïðîâåðêà íà Òåðì.
Operand - Ïðîâåðêà íà Îïåðàíä.
IDENT - Ïðîâåðêà íà Èäåíòèôèêàòîð ñ ñèìâîëà y.
Òåêóùèé ñèìâîë - - 45.
AB - Ïðîâåðêà íà Àðèôìåòè÷åñêîå Âûðàæåíèå.
Òåêóùèé ñèìâîë 5 - 53.
Term - Ïðîâåðêà íà Òåðì.
Operand - Ïðîâåðêà íà Îïåðàíä.
IDENT - Ïðîâåðêà íà Èäåíòèôèêàòîð ñ ñèìâîëà 5.
FLOAT - ïðîâåðêà íà ÷èñëî ñ ïëàâàþùåé çàïÿòîé ñ öèôðû 5.
Òåêóùèé ñèìâîë 5 - 53.
Òåêóùèé ñèìâîë 5 - 53.
Òåêóùèé ñèìâîë ) - 41.
Òåêóùèé ñèìâîë ) - 41.
Òåêóùèé ñèìâîë * - 42.
Òåêóùèé ñèìâîë * - 42.
Òåêóùèé ñèìâîë 6 - 54.
Term - Ïðîâåðêà íà Òåðì.
Operand - Ïðîâåðêà íà Îïåðàíä.
IDENT - Ïðîâåðêà íà Èäåíòèôèêàòîð ñ ñèìâîëà 6.
FLOAT - ïðîâåðêà íà ÷èñëî ñ ïëàâàþùåé çàïÿòîé ñ öèôðû 6.
Òåêóùèé ñèìâîë ) - 41.
Òåêóùèé ñèìâîë - 32.
Òåêóùèé ñèìâîë 6 - 54.
ABS - ïðîâåðêà íà Öåëîå Áåç Çíàêà ñ öèôðû 6.
Òåêóùèé ñèìâîë 4 - 52.
Òåêóùèé ñèìâîë , - 44.
Òåêóùèé ñèìâîë 4 - 52.
ABS - ïðîâåðêà íà Öåëîå Áåç Çíàêà ñ öèôðû 4.
Òåêóùèé ñèìâîë 4 - 52.
Òåêóùèé ñèìâîë , - 44.
Òåêóùèé ñèìâîë 5 - 53.
ABS - ïðîâåðêà íà Öåëîå Áåç Çíàêà ñ öèôðû 5.
Òåêóùèé ñèìâîë 4 - 52.
Òåêóùèé ñèìâîë 8 - 56.
Òåêóùèé ñèìâîë NULL - 0.
¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
IF(r**34/50.22) 3,56,1
¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
Òåêóùèé ñèìâîë ( - 40.
AB - Ïðîâåðêà íà Àðèôìåòè÷åñêîå Âûðàæåíèå.
Òåêóùèé ñèìâîë r - 114.
Term - Ïðîâåðêà íà Òåðì.
Operand - Ïðîâåðêà íà Îïåðàíä.
IDENT - Ïðîâåðêà íà Èäåíòèôèêàòîð ñ ñèìâîëà r.
Òåêóùèé ñèìâîë * - 42.
Òåêóùèé ñèìâîë * - 42.
Òåêóùèé ñèìâîë 3 - 51.
Term - Ïðîâåðêà íà Òåðì.
Operand - Ïðîâåðêà íà Îïåðàíä.
IDENT - Ïðîâåðêà íà Èäåíòèôèêàòîð ñ ñèìâîëà 3.
FLOAT - ïðîâåðêà íà ÷èñëî ñ ïëàâàþùåé çàïÿòîé ñ öèôðû 3.
Òåêóùèé ñèìâîë 4 - 52.
Òåêóùèé ñèìâîë / - 47.
Òåêóùèé ñèìâîë 5 - 53.
Term - Ïðîâåðêà íà Òåðì.
Operand - Ïðîâåðêà íà Îïåðàíä.
IDENT - Ïðîâåðêà íà Èäåíòèôèêàòîð ñ ñèìâîëà 5.
FLOAT - ïðîâåðêà íà ÷èñëî ñ ïëàâàþùåé çàïÿòîé ñ öèôðû 5.
Òåêóùèé ñèìâîë 0 - 48.
Òåêóùèé ñèìâîë . - 46.
Òåêóùèé ñèìâîë 2 - 50.
Òåêóùèé ñèìâîë 2 - 50.
Òåêóùèé ñèìâîë ) - 41.
Òåêóùèé ñèìâîë - 32.
Òåêóùèé ñèìâîë 3 - 51.
ABS - ïðîâåðêà íà Öåëîå Áåç Çíàêà ñ öèôðû 3.
Òåêóùèé ñèìâîë , - 44.
Òåêóùèé ñèìâîë 5 - 53.
ABS - ïðîâåðêà íà Öåëîå Áåç Çíàêà ñ öèôðû 5.
Òåêóùèé ñèìâîë 6 - 54.
Òåêóùèé ñèìâîë , - 44.
Òåêóùèé ñèìâîë 1 - 49.
ABS - ïðîâåðêà íà Öåëîå Áåç Çíàêà ñ öèôðû 1.
Òåêóùèé ñèìâîë NULL - 0.
¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
Ëèñòèíã ïðîãðàììû.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// FILE "KURSOVIC.CPP".
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// ÂÀÐÈÀHÒ # 2.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Àðèôìåòè÷åñêèé îïåðàòîð óñëîâíîãî ïåðåõîäà ÿçûêà FORTRAN.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Êàôåäpà : ÀÑÓ.
// Ãpóïïà : À-513.
// Ñòóäåíò : Áîéêî Êîíñòàíòèí Àíàòîëüåâè÷.
// Ïpåïîäàâàòåëè : êàíäèäàò òåõíè÷åñêèõ íàóê, äîöåíò Øîpíèêîâ Þpèé Âëàäèìèpîâè÷,
// àññèñòåíò Ïàíîâà Âåpà Áîpèñîâíà.
// Äàòà : 30 àïðåëÿ 1997ã.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Çàãîëîâî÷íûå ôàéëû.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
# include<stdio.h>
# include<conio.h>
# include<string.h>
# include<stdlib.h>
# include "keyboard.h"
# include<dos.h>
# include <ctype.h>
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Êîíñòàíòû.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
# define FILE_NAME "TEXT.TXT"
# define YES 1
# define NO 2
# define OK 3
//# define TEST
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Ãëîáàëüíûå ïåðåìåííûå.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
char file1[22][60]; // Ìàññèâ ñòðîê.
char mes[22][30][50]; // Ìàññèâ ñîîáùåíèé îá îøèáêàõ.
char bufer[4096]; // Ñíèìîê ñ ýêðàíà.
int com=0; // Ïîêàçàòåëü : îòêîìïèëèðîâàí ôàéë èëè íåò.
int pos=2; // Òåêóùàÿ ïîçèöèÿ â ñòðîêå.
char string[80]; // Òåêóùàÿ ñòðîêà ôàéëà.
char nx; // Òåêóùèé ñèìâîë â ñòðîêå.
int e1=0; // Ñ÷åò÷èê ñòðàíèö ìàññèâà ñîáùåíèé îá îøèáêàõ.
int e2=0; // Ñ÷åò÷èê ñòðîê â ñòðàíèöå.
int l=0; // Ñ÷åò÷èê ìåòîê.
FILE* fl=fopen("MESSAGE.TXT","wt"); // Ôàéë ñ ñîîáùåíèÿìè îá îøèáêàõ.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Ïðîòîòèïû ôóíêöèé.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
void Windows(int,int,int,int,char*); // Ïîñòðîåíèå îêîí.
void Beep(int,int); // Çâóêîâîé ñèãíàë.
void Open_File(void); // Îòêðûòèå ôàéëà.
void Second_Window(void); // Ïîñòðîåíèå íèæíåé ïàíåëè.
void MyPuts(char*,int); // Àíàëîã puts(char*).
void Print_File(void); // Ïå÷àòü ôàéëà.
void Menu(void); // Ìåíþ.
int i_readkey(void); // Îïðîñ êëàâèàòóðû.
void Help(void); // Ïîìîùü.
void Grammar(void); // Ãðàììàòèêà ÿçûêà.
void Language(void); // ßçûê îïåðàòîðà.
void Compile(void); // Êîìïèëÿöèÿ.
void Operator(char*); // Ñêàíèðîâàíèå îïåðàòîðà.
void Scan(void); // Ñêàíèðîâàíèå ñëåäóþùåãî ñèìâîëà.
void Label(void); // Ðåàëèçàöèÿ Label.
int ABS(void); // Ðåàëèçàöèÿ ABS.
int IDENT(void); // Ðåàëèçàöèÿ IDENT.
int AB(void); // Ðåàëèçàöèÿ AB.
void Error(int); // Îáðàáîòêà îøèáêè.
int Term(void); // Ðåàëèçàöèÿ Term.
int Operand(void); // Ðåàëèçàöèÿ Operand.
int Float(void); // Ðåàëèçàöèÿ Float.
void Message(int); // Âûâîä ñîîáùåíèé îá îøèáêàõ.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Ôóíêöèÿ MAIN.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
void main()
{
_setcursortype(_SOLIDCURSOR);
window(1,1,80,25);
textattr(113);
clrscr();
for(int i=0;i<24;i++)
cputs("");
textcolor(BLACK);
cputs(" Enter filename");
window(20,7,60,17);
textattr(127);
clrscr();
Windows(20,7,60,17,"Open a File");
gotoxy(4,3);
puts("Name ");
gotoxy(6,7);
puts("Ïî óìîë÷àíèþ áóäåò ââåäåí ôàéë");
gotoxy(17,8);
puts(FILE_NAME);
window(23,10,57,10);
textattr(31);
clrscr();
Open_File();
Second_Window();
Print_File();
_setcursortype(_NOCURSOR);
Menu();
}
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Çâóêîâîé ñèãíàë.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
void Beep(int tone,int pause)
{
sound(tone);
delay(pause);
nosound();
}
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Ïîñòðîåíèå ðàìîê.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
void Windows(int x,int y,int x1,int y1,char* string)
{
y1++;
for(int i=2;i<x1-x;i++)
{
gotoxy(i,1);
putch('=');
gotoxy(i,y1-y);
putch('=');
}
for(i=1;i<y1-y;i++)
{
gotoxy(2,i);
putch('¦');
gotoxy(x1-x,i);
putch('¦');
}
gotoxy(2,1);
putch('ã');
gotoxy(x1-x,1);
putch('¬');
gotoxy(x1-x,y1-y);
putch('-');
gotoxy(2,y1-y);
putch('L');
gotoxy((x1-x-strlen(string)+2)/2,1);
puts(string);
}
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Ôóíêöèÿ îòêðûòèÿ ôàéëà.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
void Open_File(void)
{
char filename[38];
filename[0]=35;
char* p=cgets(filename);
strcpy(filename,p);
if(filename[0]==NULL)
strcpy(filename,FILE_NAME);
FILE *file;
if ((file = fopen(filename, "rt"))== NULL)
{
window(1,1,80,25);
textattr(7);
_setcursortype(_NORMALCURSOR);
clrscr();
perror("ERROR");
fcloseall();
getch();
exit(1);
}
for(int i=0;i<22;i++)
{
char temp[255];
if((fgets(temp,80,file))==NULL)
break;
strcpy(file1[i],temp);
}
fclose(file);
}
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Ïîñòðîåíèå íèæíåé ïàíåëè.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
void Second_Window(void)
{
window(1,1,80,25);
textattr(17);
clrscr();
window(1,1,80,24);
textattr(31);
clrscr();
Windows(1,1,80,24,"File");
window(1,25,80,25);
textattr(127);
clrscr();
MyPuts(" ~F1~ Help ~F2~ Grammar ~F3~ Language ~F4~ Compile ~ESC~ Exit",
LIGHTBLUE);
}
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// MyPuts.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
void MyPuts(char* string,int color)
{
int j=0;
for(int i=0;string[i] != NULL;i++)
{
if(string[i]=='~' && j==0)
{
textcolor(color);
i++;
j++;
}
if(string[i]=='~' && j!=0)
{
textcolor(BLACK);
i++;
j--;
}
cprintf("%c",string[i]);
if(string[i]==NULL)
break;
}
}
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Ôóíêöèÿ âûâîäà ôàéëà íà ýêðàí.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
void Print_File(void)
{
window(3,2,77,24);
textattr(31);
for(int i=0;i<22;i++)
{
cputs(file1[i]);
putch('\r');
}
}
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Ìåíþ.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
void Menu(void)
{
gettext(1,1,80,25,bufer); // Âñÿ èíôîðìàöèÿ ñ ýêðàíà çàíîñèòñÿ â áóôåð.
int y=1; // Ñ÷åò÷èê ñòðîê.
gotoxy(1,1);
textattr(63);
clreol();
cputs(file1[0]);
textattr(31);
gotoxy(5,23);
cprintf(" %-2d ",y);
while(1)
{
switch (i_readkey())
{
case EASC_F1:
gettext(1,1,80,25,bufer);
Help();
puttext(1,1,80,25,bufer);
break;
case EASC_F2:
gettext(1,1,80,25,bufer);
Grammar();
puttext(1,1,80,25,bufer);
break;
case EASC_F3:
gettext(1,1,80,25,bufer);
Language();
puttext(1,1,80,25,bufer);
break;
case EASC_F4:
gettext(1,1,80,25,bufer);
Compile();
puttext(1,1,80,25,bufer);
window(48,2,78,23);
textattr(95);
clrscr();
Windows(49,3,79,24,"Message");
Message(y-1);
break;
case EASC_Esc:
window(1,1,80,25);
textattr(7);
clrscr();
fcloseall();
exit(1);
break;
case EASC_Up:
if(y>1)
{
if(com>0)
window(3,2,47,24);
else
window(3,2,77,24);
y--;
gotoxy(1,y);
textattr(63);
clreol();
cputs(file1[y-1]);
gotoxy(1,y+1);
textattr(31);
clreol();
cputs(file1[y]);
gotoxy(5,23);
cprintf(" %d ",y);
if(com>0)
Message(y-1);
}
break;
case EASC_Down:
if(y<22)
{
if(com>0)
window(3,2,47,24);
else
window(3,2,77,24);
gotoxy(1,++y);
textattr(63);
clreol();
cputs(file1[y-1]);
gotoxy(1,y-1);
textattr(31);
clreol();
cputs(file1[y-2]);
gotoxy(5,23);
cprintf(" %d ",y);
if(com>0)
Message(y-1);
}
break;
}
}
}
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Help.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
void Help(void)
{
window(1,1,80,25);
textattr(78);
clrscr();
Windows(1,1,80,25,"Help");
window(4,3,77,23);
cprintf("ÍÎÂÎÑÈÁÈÐÑÊÈÉ ÃÎÑÓÄÀÐÑÒÂÅÍÍÛÉ ÒÅÕÍÈ×ÅÑÊÈÉ
ÓÍÈÂÅÐÑÈÒÅÒ\n\n\r");
cprintf(" ÊÀÔÅÄÐÀ ÀÑÓ\n\n\r");
cprintf(" Êóðñîâàÿ ðàáîòà ïî ñèñòåìíîìó ïðîãðàììèðîâàíèþ íà òåìó:\n\r");
cprintf(" \"Àðèôìåòè÷åñêèé îïåðàòîð óñëîâíîãî ïåðåõîäà ÿçûêà FORTRAN\".\n\n\r");
cprintf(" Ñòóäåíòà ãðóïïû À-513\n\n\r");
cprintf(" Áîéêî Êîíñòàíòèíà Àíàòîëüåâè÷à.\n\n\r");
cprintf("Â ïðîãðàììå èñïîëüçîâàíû êëàâèøè:\n\r");
cprintf(" F1 - äàííûé Help.\n\r");
cprintf(" F2 - ãðàììàòèêà ÿçûêà.\n\r");
cprintf(" F3 - ÿçûê îïåðàòîðà.\n\r");
cprintf(" F4 - êîìïèëÿöèÿ ôàéëà.\n\r");
cprintf(" ESC - âûõîä èç ïðîãðàììû.\n\n\r");
cprintf(" Äëÿ âûõîäà èç Help íàæìèòå ëþáóþ êëàâèøó.");
getch();
}
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Ãðàììàòèêà.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
void Grammar(void)
{
window(10,2,70,23);
textattr(46);
clrscr();
Windows(10,2,70,23,"Grammar");
window(12,4,68,22);
cprintf(" 1. <Îïåðàòîð> -> IF(<ÀÂ>)<LABEL>,<LABEL>,<LABEL>\n\r");
cprintf(" 2. <LABEL> -> <ÖÁÇ>\n\r");
cprintf(" 3. <ÀÂ> -> T | <ÀÂ>+T | <ÀÂ>-T\n\r");
cprintf(" 4. T -> O | T*O | T/O | T**O\n\r");
cprintf(" 5. O -> (<ÀÂ>) | <Èäåíòèôèêàòîð> | <×ÏÇ>\n\r");
cprintf(" 6. <Èäåíòèôèêàòîð> -> Á{Á|Ö}\n\r");
cprintf(" 7. <ÖÁÇ> -> Ö{Ö}\n\r");
cprintf(" 8. <×ÏÇ> -> Ö{Ö}[.Ö{Ö}]\n\n\r");
cprintf(" Óñëîâíûå îáîçíà÷åíèÿ:\n\r");
cprintf(" T - òåðì.\n\r");
cprintf(" O - îïåðàíä.\n\r");
cprintf(" Á - áóêâà.\n\r");
cprintf(" Ö - öèôðà.\n\r");
cprintf(" ÖÁÇ - öåëîå áåç çíàêà.\n\r");
cprintf(" ×ÏÇ - ÷èñëî ñ ïëàâàþùåé çàïÿòîé.\n\r");
cprintf(" ** - âîçâåäåíèå â ñòåïåíü.\n\r");
cprintf(" <LABEL> - ìåòêà.\n\r");
cprintf(" <ÀÂ> - àðèôìåòè÷åñêîå âûðàæåíèå.");
getch();
}
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// ßçûê.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
void Language(void)
{
window(20,7,60,17);
textattr(62);
clrscr();
Windows(20,7,60,17,"Language");
window(22,9,58,16);
cprintf(" IF(<ÀÂ>) LABEL1,LABEL2,LABEL3\n\n\r");
cprintf(" À - Àðèôìåòè÷åñêîå Âûðàæåíèå.\n\r");
cprintf(" LABEL1,LABEL2,LABEL3 - ïåðâàÿ,âòîðàÿ è òðåòüÿ ìåòêè ñîîòâåòñòâåííî.\n\r");
getch();
}
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Êîìïèëÿöèÿ ïðîãðàììû.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
void Compile(void)
{
window(20,7,55,13);
textattr(94);
clrscr();
Windows(20,7,55,13,"Compile");
window(22,8,58,16);
gotoxy(1,1);
if(com!=0)
{
cprintf("\n\n Ôàéë îòêîìïèëèðîâàí!");
Beep(900,1000);
return;
}
cputs("\n Èäåò êîìïèëÿöèÿ ôàéëà.\r\n\n Ïîæàëóéñòà, ïîäîæäèòå...");
#ifdef TEST
window(1,1,80,25);
clrscr();
#endif
for(int i=0;file1[i][0]!=NULL;i++)
{
Operator(file1[i]);
if(l!=3 && l!=0)
Error(11);
e1++;
e2=0;
}
com++;
delay(300);
Beep(1000,200);
}
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Îïåðàòîð.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
void Operator(char* str)
{
pos=2;
l=0;
string[0]=NULL;
strcpy(string,str);
string[strlen(string)-1]=NULL;
char temp[3];
temp[0]=str[0];
temp[1]=str[1];
temp[2]=NULL;
#ifdef TEST
puts(string);
puts(temp);
getch();
#endif
fprintf(fl," ¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾\n");
fprintf(fl,"%s\n",string);
if(strcmp(temp,"IF")!=0)
{
#ifdef TEST
printf("Íå íàéäåí îïåðàòîð IF.\n");
#endif
Error(10);
return;
}
Scan();
if(nx==' ')
Scan();
if(nx!='(')
Error(7);
if(nx==NULL)
{
Error(12);
Error(9);
return;
}
AB();
while(nx!=')' && nx!=NULL && nx!=' ')
Scan();
if(nx!=')')
Error(3);
if(nx==NULL)
{
Error(9);
return;
}
Scan();
if(nx==NULL)
{
Error(9);
return;
}
if(nx==' ')
Scan();
Label();
if(nx!=',')
{
Error(5);
Scan();
}
else
Scan();
if(nx==NULL)
return;
Label();
if(nx!=',')
{
Error(5);
Scan();
}
else
Scan();
if(nx==NULL)
return;
Label();
if(nx!=NULL)
{
Error(6);
Scan();
}
return;
}
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Scan.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
void Scan(void)
{
nx=string[pos++];
#ifdef TEST
printf("Òåêóùèé ñèìâîë %c - %d.\n",nx,nx);
#endif
fprintf(fl,"Òåêóùèé ñèìâîë %c - %d.\n",nx,nx);
}
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Ìåòêà.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
void Label(void)
{
if(ABS() == NO)
{
Error(8);
Scan();
}
else
l++;
}
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Öåëîå Áåç Çíàêà.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
int ABS(void)
{
#ifdef TEST
cprintf("ABS - ïðîâåðêà íà Öåëîå Áåç Çíàêà ñ öèôðû %c.\r\n",nx);
#endif
fprintf(fl,"ABS - ïðîâåðêà íà Öåëîå Áåç Çíàêà ñ öèôðû %c.\n",nx);
if(isdigit(nx))
{
while(isdigit(nx))
Scan();
return(YES);
}
return(NO);
}
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Àðèôìåòè÷åñêîå Âûðàæåíèå.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
int AB(void)
{
#ifdef TEST
cprintf("AB - Ïðîâåðêà íà Àðèôìåòè÷åñêîå Âûðàæåíèå.\r\n");
#endif
fprintf(fl,"AB - Ïðîâåðêà íà Àðèôìåòè÷åñêîå Âûðàæåíèå.\n");
Scan();
if(nx==')')
{
Error(12);
return(NO);
}
Term();
if(nx=='+')
{
AB();
}
else if(nx=='-')
{
AB();
}
if(nx==NULL)
return(OK);
else if(nx!='*' && nx!='/' && nx!=')')
Error(1);
return(YES);
}
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Òåðì.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
int Term(void)
{
#ifdef TEST
cprintf("Term - Ïðîâåðêà íà Òåðì.\r\n");
#endif
fprintf(fl,"Term - Ïðîâåðêà íà Òåðì.\n");
Operand();
if(nx=='/')
{
Scan();
Term();
}
else if(nx=='*')
{
Scan();
if(nx=='*')
{
Scan();
Term();
}
else Term();
}
if(nx==NULL)
return(OK);
else if(nx!='+' && nx!='-' && nx!=')')
Error(2);
return(OK);
}
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Îïåðàíä.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
int Operand(void)
{
#ifdef TEST
cprintf("Operand - Ïðîâåðêà íà Îïåðàíä.\r\n");
#endif
fprintf(fl,"Operand - Ïðîâåðêà íà Îïåðàíä.\n");
if(nx=='(')
{
AB();
if(nx!=')')
Error(3);
else
{
Scan();
return(OK);
}
}
else if(IDENT() == NO)
{
if(Float() == NO)
Error(4);
}
return(OK);
}
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Èäåíòèôèêàòîð.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
int IDENT(void)
{
#ifdef TEST
cprintf("IDENT - Ïðîâåðêà íà Èäåíòèôèêàòîð ñ ñèìâîëà %c.\r\n",nx);
#endif
fprintf(fl,"IDENT - Ïðîâåðêà íà Èäåíòèôèêàòîð ñ ñèìâîëà %c.\n",nx);
if(isalpha(nx))
{
while(isalpha(nx) || isdigit(nx))
Scan();
return(YES);
}
return(NO);
}
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Îøèáêè.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
void Error(int num)
{
char *E[]={
"Îæèäàåòñÿ '+' èëè '-'.",
"Îæèäàåòñÿ '*','/' èëè '**'.",
"Îæèäàåòñÿ ).",
"Îæèäàåòñÿ èäåíòèôèêàòîð èëè öåëîå áåç çíàêà.",
"Îòñóòñòâóåò ','.",
"Íå êîíåö ñòðîêè.",
"Îæèäàåòñÿ (.",
"Ìåòêà - íå öåëîå áåç çíàêà.",
"Îòñóòñòâóþò ìåòêè.",
"Íå íàéäåí îïåðàòîð IF.",
"Îòñóòñòâóåò ìåòêà.",
"Îòñóòñòâóåò AB.",
NULL
};
sprintf(mes[e1][e2],"%s",E[num-1]);
e2++;
#ifdef TEST
Beep(1000,100);
cprintf("Îøèáêà: %s\r\n",E[num-1]);
getch();
#endif
fprintf(fl," ¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾\n");
fprintf(fl,"Îøèáêà: %s\r\n",E[num-1]);
}
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Float.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
int Float(void)
{
#ifdef TEST
cprintf("FLOAT - ïðîâåðêà íà ÷èñëî ñ ïëàâàþùåé çàïÿòîé ñ öèôðû %c.\r\n",nx);
#endif
fprintf(fl,"FLOAT - ïðîâåðêà íà ÷èñëî ñ ïëàâàþùåé çàïÿòîé ñ öèôðû %c.\n",nx);
if(isdigit(nx))
{
while(isdigit(nx))
Scan();
if(nx=='.')
{
Scan();
while(isdigit(nx))
Scan();
}
return(YES);
}
return(NO);
}
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Message.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
void Message(int x)
{
window(50,3,76,22);
textattr(95);
clrscr();
gotoxy(1,1);
for(int i=0;mes[x][i][0]!=NULL;i++)
cprintf("%s\r\n",mes[x][i]);
}
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
Ëèòåðàòóðà.
1. Êóðñ ëåêöèé ïî ñèñòåìíîìó ïðîãðàììèðîâàíèþ.
2. Ãåðáåðò Øèëäò «C äëÿ ïðîôåññèîíàëüíûõ ïðîãðàììèñòîâ».
|
|