Ðàçðàáîòêà ñèíòàêñè÷åñêîãî ðàñïîçíàâàòåëÿ âû÷èñëÿåìîãî îïåðàòîðà ïåðåõîäà ÿçûêà FORTRAN
Ðàçðàáîòêà ñèíòàêñè÷åñêîãî ðàñïîçíàâàòåëÿ âû÷èñëÿåìîãî îïåðàòîðà ïåðåõîäà ÿçûêà FORTRAN
Ìèíèñòåðñòâî íàóêè,
âûñøåé øêîëû è òåõíè÷åñêîé ïîëèòèêè Ðîññèéñêîé Ôåäåðàöèè.
Íîâîñèáèðñêèé
Ãîñóäàðñòâåííûé
Òåõíè÷åñêèé
Óíèâåðñèòåò.
Êóðñîâàÿ
ðàáîòà ïî ñèñòåìíîìó ïðîãðàììèðîâàíèþ.
Ðàçðàáîòêà
ñèíòàêñè÷åñêîãî ðàñïîçíàâàòåëÿ âû÷èñëÿåìîãî îïåðàòîðà ïåðåõîäà ÿçûêà FORTRAN.
Ôàêóëüòåò: ÀÂÒ.
Êàôåäðà: ÀÑÓ.
Ãðóïïà: À-513.
Ñòóäåíò: Áîðçîâ Àíäðåé Íèêîëàåâè÷.
Ïðåïîäàâàòåëü: Øîðíèêîâ Þðèé Âëàäèìèðîâè÷.
Àññèñòåíò: Ïàíîâà Âåðà Áîðèñîâíà.
Äàòà:
19 ìàÿ 1997
ãîäà.
Îòìåòêà î çàùèòå: _______________________________
Íîâîñèáèðñê
– 1997.
ßçûê îïåðàòîðà.
ßçûê âû÷èñëÿåìîãî îïåðàòîðà
ïåðåõîäà ÿçûêà FORTRAN.
GOTO ÌÅÒÊÀ½ÊÎÍÑÒÀÍÒÀ½ÀÐÈÔÌÅÒÈ×ÅÑÊÎÅ ÂÛÐÀÆÅÍÈÅ
ÌÅÒÊÀ
– Èäåíòèôèêàòîð
ÊÎÍÑÒÀÍÒÀ
– ÖÅËÎÅ ÁÅÇ ÇÍÀÊÀ
ÀÐÈÔÌÅÒÈ×ÅÑÊÎÅ
ÂÛÐÀÆÅÍÈÅ – ÂÛÐÀÆÅÍÈÅ, ÑÎÄÅÐÆÀÙÅÅ Â ÑÅÁÅ ÎÏÅÐÀÖÈÈ *, /, -, +, **, À ÒÀÊÆÅ ( ).
**
– ÂÎÇÂÅÄÅÍÈÅ Â ÑÒÅÏÅÍÜ.
Ãðàììàòèêà ÿçûêà.
G[<ÎÏÅÐÀÒÎÐ>]:
1.<ÎÏÅÐÀÒÎÐ> ® GOTO <ÂÛÐÀÆÅÍÈÅ>
2.<ÂÛÐÀÆÅÍÈÅ> ® Ò ç<ÂÛÐÀÆÅÍÈÅ>+Ò ç <ÂÛÐÀÆÅÍÈÅ>-Ò
3.Ò ® Î çÒ*Î ç Ò/Î êÒ**Î
4.Î ®(<ÂÛÐÀÆÅÍÈÅ>) ç<ÈÄÅÍÒÈÔÈÊÀÒÎÐ> ç<ÄÁÇ>
5.<ÈÄÅÍÒÈÔÈÊÀÒÎÐ> ® Á{Á çÖ}[L]
6.<ÄÁÇ> ® Ö{Ö}[.Ö{Ö}][L]
Ò
|
–
|
ÒÅÐÌ
|
Î
|
–
|
ÎÏÅÐÀÍÄ
|
Á
|
–
|
ÁÓÊÂÀ
|
Ö
|
–
|
ÖÈÔÐÀ
|
ÄÁÇ
|
–
|
ÄÐÎÁÍÎÅ
ÁÅÇ ÇÍÀÊÀ
|
L
|
–
|
ÊÎÍÅÖ
ÑÒÐÎÊÈ (ïóñòî)
|
**
|
–
|
ÂÎÇÂÅÄÅÍÈÅ
 ÑÒÅÏÅÍÜ
|
Êëàññèôèêàöèÿ ãðàììàòèêè.
Äàííàÿ ãðàììàòèêà G[<ÎÏÅÐÀÒÎÐ>], ñîãëàñíî êëàññèôèêàöèè Õîìñêîãî, ÿâëÿåòñÿ
êîíòåêñòíî-ñâîáîäíîé, òàê êàê ïðàâàÿ ÷àñòü êàæäîé ðåäóêöèè íà÷èíàåòñÿ ëèáî ñ
òåðìèíàëüíîãî ñèìâîëà, ëèáî ñ íåòåðìèíàëüíîãî, ïðèíàäëåæàùåãî îáúåäèí¸ííîìó
ñëîâàðþ.
A ® a, AÎVn, aÎV*.
Ãðàììàòèêà G[<ÎÏÅÐÀÒÎÐ>] íå ÿâëÿåòñÿ àâòîìàòíîé, òàê êàê íå âñå å¸
ðåäóêöèè íà÷èíàþòñÿ ñ òåðìèíàëüíîãî ñèìâîëà. Ïî ýòîé æå ïðè÷èíå äàííàÿ
ãðàììàòèêà íå ÿâëÿåòñÿ S - ãðàììàòèêîé.
Ìåòîä àíàëèçà.
Äëÿ äàííîé ãðàììàòèêè ðåàëèçîâàí ðàçáîð ìåòîäîì
ðåêóðñèâíîãî ñïóñêà, ïîñêîëüêó îíà îòíîñèòñÿ ê êëàññó êîíòåêñòíî-ñâîáîäíûõ.
Èäåÿ ìåòîäà ñîñòîèò â òîì, ÷òî êàæäîìó íåòåðìèíàëüíîìó ñèìâîëó
ñòàâèòñÿ â ñîîòâåòñòâèå îïðåäåë¸ííàÿ ïðîãðàììíàÿ åäèíèöà (ôóíêöèÿ), êîòîðàÿ
ðàñïîçíà¸ò öåïî÷êó, ïîðîæäàåìóþ ýòèì íåòåðìèíàëîì.
Ýòè ïðîöåäóðû è ôóíêöèè âûçûâàþòñÿ â ñîîòâåòñòâèè ñ ïðàâèëàìè
ãðàììàòèêè è èíîãäà âûçûâàþò ñàìè ñåáÿ.
Äàííûé ìåòîä ðåàëèçîâàí íà ÿçûêå C++, ïîñêîëüêó îí
îáëàäàåò ðåêóðñèâíûìè âîçìîæíîñòÿìè.
Äèàãíîñòèêà è íåéòðàëèçàöèÿ îøèáîê.
Äëÿ äàííîé ãðàììàòèêè ïðîèçâîäèòñÿ òîëüêî äèàãíîñòèêà
è íåéòðàëèçàöèÿ îøèáîê. Èñïðàâëåíèå îøèáîê íå ïðîèçâîäèòñÿ.
Íåéòðàëèçàöèÿ îøèáîê îñóùåñòâëÿåòñÿ ïî ìåòîäó Àéðîíñà,
òî åñòü, ñïóñêàÿñü ïî ñèíòàêñè÷åñêîìó äåðåâó áåç âîçâðàòà ïî êîíòåêñòó, ïðè
îáíàðóæåíèè òóïèêîâîé ñèòóàöèè îòáðàñûâàþòñÿ òå ëèòåðû (ñèìâîëû), êîòîðûå
ïðèâåëè â òóïèêîâóþ ñèòóàöèþ è ðàçáîð ïðîäîëæàåòñÿ.
Òåñòèðîâàíèå.
¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
Ïðîòîêîë
ðàáîòû ñèíòàêñè÷åñêîãî ðàñïîçíàâàòåëÿ âû÷èñëÿåìîãî îïåðàòîðà ïåðåõîäà ÿçûêà
FORTRAN.
¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
GOTO A+B-DD**(CC/(23+34**R))+Y*((C))
¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
AB - Ïðîâåðêà íà Àðèôìåòè÷åñêîå Âûðàæåíèå.
SCAN - Ñêàíèðîâàíèå. Òåêóùèé ñèìâîë 'A' ñ
êîäîì 65.
T - Ïðîâåðêà íà Òåðì.
O - Ïðîâåðêà íà Îïåðàíä.
IDENT - Ïðîâåðêà íà Èäåíòèôèêàòîð ñ ñèìâîëà A.
SCAN - Ñêàíèðîâàíèå. Òåêóùèé ñèìâîë '+' ñ
êîäîì 43.
AB - Ïðîâåðêà íà Àðèôìåòè÷åñêîå Âûðàæåíèå.
SCAN - Ñêàíèðîâàíèå. Òåêóùèé ñèìâîë 'B' ñ
êîäîì 66.
T - Ïðîâåðêà íà Òåðì.
O - Ïðîâåðêà íà Îïåðàíä.
IDENT - Ïðîâåðêà íà Èäåíòèôèêàòîð ñ ñèìâîëà B.
SCAN - Ñêàíèðîâàíèå. Òåêóùèé ñèìâîë '-' ñ
êîäîì 45.
AB - Ïðîâåðêà íà Àðèôìåòè÷åñêîå Âûðàæåíèå.
SCAN - Ñêàíèðîâàíèå. Òåêóùèé ñèìâîë 'D' ñ
êîäîì 68.
T - Ïðîâåðêà íà Òåðì.
O - Ïðîâåðêà íà Îïåðàíä.
IDENT - Ïðîâåðêà íà Èäåíòèôèêàòîð ñ ñèìâîëà D.
SCAN - Ñêàíèðîâàíèå. Òåêóùèé ñèìâîë 'D' ñ
êîäîì 68.
SCAN - Ñêàíèðîâàíèå. Òåêóùèé ñèìâîë '*' ñ
êîäîì 42.
SCAN - Ñêàíèðîâàíèå. Òåêóùèé ñèìâîë '*' ñ
êîäîì 42.
SCAN - Ñêàíèðîâàíèå. Òåêóùèé ñèìâîë '(' ñ
êîäîì 40.
T - Ïðîâåðêà íà Òåðì.
O - Ïðîâåðêà íà Îïåðàíä.
AB - Ïðîâåðêà íà Àðèôìåòè÷åñêîå Âûðàæåíèå.
SCAN - Ñêàíèðîâàíèå. Òåêóùèé ñèìâîë 'C' ñ
êîäîì 67.
T - Ïðîâåðêà íà Òåðì.
O - Ïðîâåðêà íà Îïåðàíä.
IDENT - Ïðîâåðêà íà Èäåíòèôèêàòîð ñ ñèìâîëà C.
SCAN - Ñêàíèðîâàíèå. Òåêóùèé ñèìâîë 'C' ñ
êîäîì 67.
SCAN - Ñêàíèðîâàíèå. Òåêóùèé ñèìâîë '/' ñ
êîäîì 47.
SCAN - Ñêàíèðîâàíèå. Òåêóùèé ñèìâîë '(' ñ
êîäîì 40.
T - Ïðîâåðêà íà Òåðì.
O - Ïðîâåðêà íà Îïåðàíä.
AB - Ïðîâåðêà íà Àðèôìåòè÷åñêîå Âûðàæåíèå.
SCAN - Ñêàíèðîâàíèå. Òåêóùèé ñèìâîë '2' ñ êîäîì
50.
T - Ïðîâåðêà íà Òåðì.
O - Ïðîâåðêà íà Îïåðàíä.
IDENT - Ïðîâåðêà íà Èäåíòèôèêàòîð ñ ñèìâîëà 2.
FLOAT - Ïðîâåðêà íà Äðîáíîå Áåç Çíàêà ñ
öèôðû 2.
SCAN - Ñêàíèðîâàíèå. Òåêóùèé ñèìâîë '3' ñ
êîäîì 51.
SCAN - Ñêàíèðîâàíèå. Òåêóùèé ñèìâîë '+' ñ
êîäîì 43.
AB - Ïðîâåðêà íà Àðèôìåòè÷åñêîå Âûðàæåíèå.
SCAN - Ñêàíèðîâàíèå. Òåêóùèé ñèìâîë '3' ñ
êîäîì 51.
T - Ïðîâåðêà íà Òåðì.
O - Ïðîâåðêà íà Îïåðàíä.
IDENT - Ïðîâåðêà íà Èäåíòèôèêàòîð ñ ñèìâîëà 3.
FLOAT - Ïðîâåðêà íà Äðîáíîå Áåç Çíàêà ñ öèôðû
3.
SCAN - Ñêàíèðîâàíèå. Òåêóùèé ñèìâîë '4' ñ
êîäîì 52.
SCAN - Ñêàíèðîâàíèå. Òåêóùèé ñèìâîë '*' ñ
êîäîì 42.
SCAN - Ñêàíèðîâàíèå. Òåêóùèé ñèìâîë '*' ñ
êîäîì 42.
SCAN - Ñêàíèðîâàíèå. Òåêóùèé ñèìâîë 'R' ñ
êîäîì 82.
T - Ïðîâåðêà íà Òåðì.
O - Ïðîâåðêà íà Îïåðàíä.
IDENT - Ïðîâåðêà íà Èäåíòèôèêàòîð ñ ñèìâîëà R.
SCAN - Ñêàíèðîâàíèå. Òåêóùèé ñèìâîë ')' ñ
êîäîì 41.
SCAN - Ñêàíèðîâàíèå. Òåêóùèé ñèìâîë ')' ñ
êîäîì 41.
SCAN - Ñêàíèðîâàíèå. Òåêóùèé ñèìâîë '+' ñ
êîäîì 43.
AB - Ïðîâåðêà íà Àðèôìåòè÷åñêîå Âûðàæåíèå.
SCAN - Ñêàíèðîâàíèå. Òåêóùèé ñèìâîë 'Y' ñ
êîäîì 89.
T - Ïðîâåðêà íà Òåðì.
O - Ïðîâåðêà íà Îïåðàíä.
IDENT - Ïðîâåðêà íà Èäåíòèôèêàòîð ñ ñèìâîëà Y.
SCAN - Ñêàíèðîâàíèå. Òåêóùèé ñèìâîë '*' ñ
êîäîì 42.
SCAN - Ñêàíèðîâàíèå. Òåêóùèé ñèìâîë '(' ñ
êîäîì 40.
T - Ïðîâåðêà íà Òåðì.
O - Ïðîâåðêà íà Îïåðàíä.
AB - Ïðîâåðêà íà Àðèôìåòè÷åñêîå Âûðàæåíèå.
SCAN - Ñêàíèðîâàíèå. Òåêóùèé ñèìâîë '(' ñ
êîäîì 40.
T - Ïðîâåðêà íà Òåðì.
O - Ïðîâåðêà íà Îïåðàíä.
AB - Ïðîâåðêà íà Àðèôìåòè÷åñêîå Âûðàæåíèå.
SCAN - Ñêàíèðîâàíèå. Òåêóùèé ñèìâîë 'C' ñ
êîäîì 67.
T - Ïðîâåðêà íà Òåðì.
O - Ïðîâåðêà íà Îïåðàíä.
IDENT - Ïðîâåðêà íà Èäåíòèôèêàòîð ñ ñèìâîëà C.
SCAN - Ñêàíèðîâàíèå. Òåêóùèé ñèìâîë ')' ñ
êîäîì 41.
SCAN - Ñêàíèðîâàíèå. Òåêóùèé ñèìâîë ')' ñ
êîäîì 41.
SCAN - Ñêàíèðîâàíèå. Òåêóùèé ñèìâîë NULL
ñ êîäîì 0.
¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
GOTO A
¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
AB - Ïðîâåðêà íà Àðèôìåòè÷åñêîå Âûðàæåíèå.
SCAN - Ñêàíèðîâàíèå. Òåêóùèé ñèìâîë 'A' ñ
êîäîì 65.
T - Ïðîâåðêà íà Òåðì.
O - Ïðîâåðêà íà Îïåðàíä.
IDENT - Ïðîâåðêà íà Èäåíòèôèêàòîð ñ ñèìâîëà A.
SCAN - Ñêàíèðîâàíèå. Òåêóùèé ñèìâîë NULL ñ
êîäîì 0.
¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
Ëèñòèíã ïðîãðàììû.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// FILE "KURSOVIK.CPP".
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// ÂÀÐÈÀHÒ ¹ 3.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Îïåðàòîð
ïåðåõîäà âû÷èñëÿåìûé ÿçûêà FORTRAN.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Êàôåäðà:
ÀÑÓ.
// Ãðóïïà:
À-513.
// Ñòóäåíò:
Áîðçîâ Àíäðåé Hèêîëàåâè÷.
// Ïðåïîäàâàòåëè: êàíäèäàò
òåõíè÷åñêèõ íàóê, äîöåíò Øîðíèêîâ Þðèé Âëàäèìèðîâè÷,
// àññèñòåíò
Ïàíîâà Âåðà Áîðèñîâíà.
// Äàòà:
29 àïðåëÿ 1997ã.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Ïîäêëþ÷àåìûå
ôàéëû.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
#include<string.h>
#include<conio.h>
#include<stdio.h>
#include<dos.h>
#include<stdlib.h>
#include<ctype.h>
#include<time.h>
#include"keyboard.h"
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Ìàêðîîïðåäåëåíèÿ.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
#define ERROR 0 //
Êîä îøèáêè.
#define COL_STR 20 //
Ìàêñèìàëüíîå êîëè÷åñòâî ñòðîê.
#define STR_LEN 35 //
Äëèíà ñòðîêè.
#define MAX_STR_LEN 255 //
Ìàêñèìàëüíàÿ äëèíà ñòðîêè.
#define FILENAME "TEST.TXT" //
Èìÿ ôàéëà, îòêðûâàåìîãî ïî óìîë÷àíèþ.
#define YES 1
#define NO 2
#define OK 3
//#define TEST //
Îïðåäåëåíî, åñëè âêëþ÷åí îòëàäî÷íûé ðåæèì.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Ïðîòîòèïû
ôóíêöèé.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
int I_ReadKey(void); //
Îïðîñ êëàâèàòóðû.
void Welcome(void); //
Ýêðàí ïðè ñòàðòå ïðîãðàììû.
void Menu(void); //
Ìåíþ.
void Help(void); //
Ïîìîùü.
void MyExit(int=0); //
Êîððåêòíûé âûõîä èç ïðîãðàììû.
void Beep(int=500,int=100); //
Çâóêîâîé ñèãíàë.
void Usage(void); //
Èñïîëüçîâàíèå ïðîãðàììû.
int OpenFile(void); //
Îòêðûòèå ôàéëà.
void DrawBox(int,int,int,int,char*); //
Ðèñóåò ðàìêó ñ çàãîëîâêîì.
void PrintText(void); //
Ïå÷àòàåò îñíîâíîé òåêñò.
void Screen(void); //
Ïåðåðèñîâêà ýêðàíà.
void Compile(void); //
Êîìïèëÿöèÿ.
void Message(int); //
Âûâîä ñîîáùåíèé îá îøèáêàõ.
void MyPuts(char*,int); //
Àíàëîã puts(char*);.
void Language(void); // ßçûê
îïåðàòîðà.
void Grammar(void); //
Ãðàììàòèêà ÿçûêà.
void GetFilename(void); //
Çàïðîñ èìåíè ôàéëà äëÿ îòêðûòèÿ.
int ScanStr(char*); //
Ïîèñê GOTO.
int Scaner(char*); //
Îáðàáîòêà ñòðîêè.
void Scan(void); //
Ñêàíèðîâàíèå ñëåäóþùåãî ñèìâîëà.
void Delspace(char*); // Óäàëåíèå íåíóæíûõ ïðîáåëîâ
â ñòðîêå.
int AB(void); //
Ðåàëèçàöèÿ íåòåðìèíàëà <ÀÂ>.
int T(void); //
Ðåàëèçàöèÿ íåòåðìèíàëà <Ò>.
int O(void); // Ðåàëèçàöèÿ
íåòåðìèíàëà <Î>.
int IDENT(void); //
Ðåàëèçàöèÿ íåòåðìèíàëà <IDENT>.
int FLOAT(void); //
Ðåàëèçàöèÿ íåòåðìèíàëà <FLOAT>.
void Error(int=0,char*
=""); // Îáðàáîòêà îøèáêè.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Ãëîáàëüíûå
ïåðåìåííûå.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
char filename[MAX_STR_LEN]; //
Èìÿ ôàéëà.
char *text[COL_STR+1]; //
Ìàññèâ óêàçàòåëåé íà ñòðîêè òåêñòà.
char screen[4096]; //
Áóôåð ïîä êîïèþ ýêðàíà.
char mes[21][20][80]; // Ìàññèâ ïîä ñîîáùåíèÿ îá
îøèáêàõ.
char nx; //
Òåêóùèé ñèìâîë.
int pos; //
Òåêóùàÿ ïîçèöèÿ â ñòðîêå.
char STR[80]; //
Ñêàíèðóåìàÿ ñòðîêà.
int ERR1; //
Ñ÷åò÷èê ñòðàíèö â ìàññèâå îøèáîê.
int ERR2; //
Ñ÷åò÷èê ñòðîê â ìàññèâå îøèáîê.
FILE *errors; //
Äåñêðèïòîð ôàéëà.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Ôóíêöèÿ
MAIN.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
void main(int argc,char*
argv[])
{
textcolor(LIGHTGRAY);
textbackground(BLACK);
_setcursortype(_NOCURSOR);
clrscr();
if(argc>2)
{
Usage();
MyExit();
}
if(argc==2)
strcpy(filename,argv[1]);
else
{
Welcome();
gettext(20,7,60,17,screen);
GetFilename();
}
while(OpenFile())
{
puttext(20,7,60,17,screen);
GetFilename();
}
Menu();
}
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Âûâîä
ñîîáùåíèé îá îøèáêàõ.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
void Message(int j)
{
window(42,3,79,23);
textcolor(BLUE);
textbackground(CYAN);
clrscr();
for(int
i=0;i<COL_STR && mes[j][i][0]!=NULL;i++)
cprintf("%-30s\r\n",mes[j][i]);
}
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Ãpàììàòèêà
ÿçûêà.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
void Grammar(void)
{
window(1,25,80,25);
textattr(112);
MyPuts("
~F1~ Help ~F2~ Grammar ~F3~ Language ~F9~ Compile ~F10~ Quit ~Alt-X~
Quit ~Esc~ Quit",DARKGRAY);
window(10,5,70,20);
textcolor(WHITE);
textbackground(MAGENTA);
clrscr();
DrawBox(2,1,60,16,"Ãpàììàòèêà
ÿçûêà");
window(12,6,78,19);
textcolor(YELLOW);
cputs("\r\n");
cputs("
1. <Îïåpàòîp> -> GOTO <Âûpàæåíèå>\r\n");
cputs("
2. <Âûpàæåíèå> -> T | <Âûpàæåíèå>+T |
<Âûpàæåíèå>-T\r\n");
cputs("
3. T -> O | T*O | T/O | T**O\r\n");
cputs("
4. O -> (<Âûpàæåíèå>) | <Èäåíòèôèêàòîp> | <ÄÁÇ>\r\n");
cputs("
5. <Èäåíòèôèêàòîp> -> ÁÁ[L]\r\n");
cputs("
6. <ÄÁÇ> -> Ö{Ö}[.Ö{Ö}][L]\r\n\n");
cputs("
T - Òåpì;\r\n");
cputs("
O - Îïåpàíä;\r\n");
cputs("
Á - Áóêâà;\r\n");
cputs("
Ö - Öèôpà;\r\n");
cputs("
ÄÁÇ - Äðîáíîå Áåç
Çíàêà;\r\n");
cputs("
** - âîçâåäåíèå â ñòåïåíü.");
I_ReadKey();
}
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// ßçûê
îïåðàòîðà.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
void Language(void)
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Êîìïèëÿöèÿ.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
void Compile(void)
{
static
int compile=0;
window(1,25,80,25);
textattr(112);
MyPuts("
~F1~ Help ~F2~ Grammar ~F3~ Language ~F9~ Compile ~F10~ Quit ~Alt-X~
Quit ~Esc~ Quit",DARKGRAY);
window(20,8,60,18);
textcolor(WHITE);
textbackground(RED);
clrscr();
DrawBox(2,1,40,11,"Êîìïèëÿöèÿ");
window(22,9,58,17);
textcolor(YELLOW);
cputs("\r\n");
if(compile>0)
{
cputs("
Òåêñò ÓÆÅ îòêîìïèëèðîâàí!!!");
Beep(900,1000);
return;
}
errors=fopen("PROTOCOL.TXT","wt");
cputs("
Èäåò êîìïèëÿöèÿ.\r\n\n Ïîæàëóéñòà, ïîäîæäèòå...");
#ifdef TEST
window(1,1,80,25);
textattr(78);
clrscr();
#endif
fprintf(errors,"/*******************************************************\n");
fprintf(errors,"––––––––––––––––––––––––––––––––––––––––––––––––––––––––\n");
fprintf(errors,"ç Ïðîòîêîë ðàáîòû ñèíòàêñè÷åñêîãî
ðàñïîçíàâàòåëÿ âû÷èñëÿåìîãî ç\n");
fprintf(errors,"ç îïåðàòîðà ïåðåõîäà
ÿçûêà FORTRAN. ç\n");
fprintf(errors,"––––––––––––––––––––––––––––––––––––––––––––––––––––––––\n");
for(int
i=0;text[i] != NULL;i++)
Scaner(text[i]);
fprintf(errors,"––––––––––––––––––––––––––––––––––––––––––––––––––––––––\n");
fprintf(errors,"ç ÊÎÍÅÖ.
ç\n");
fprintf(errors,"––––––––––––––––––––––––––––––––––––––––––––––––––––––––\n");
fprintf(errors,"*******************************************************/\n");
Beep(900,100);
compile++;
}
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Îáðàáîòêà
ñòðîêè.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
int Scaner(char*
string)
{
char
tmpstr[STR_LEN];
strcpy(tmpstr,string);
Delspace(tmpstr);
ScanStr(tmpstr);
return
0;
}
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Ïîèñê
â ñòðîêå îïåðàòîðà GOTO.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
int ScanStr(char*
string)
{
int
j;
int
i=0;
int
k=0;
static
int a=0;
char
tmp[80];
char
label=NO;
strcpy(STR,string);
fprintf(errors,"––––––––––––––––––––––––––––––––––––––––––––––––––––––––\n");
fprintf(errors,"%s\n",string);
fprintf(errors,"––––––––––––––––––––––––––––––––––––––––––––––––––––––––\n");
do
{
tmp[0]=NULL;
j=0;
while(!isspace(string[k++])
&& string[k-1]!=NULL)
{
tmp[j++]=string[k-1];
}
tmp[j]=NULL;
if((strcmp(tmp,"GOTO")
!= 0) && !isdigit(tmp[0]))
{
#ifdef TEST
cprintf("Íå
îïðåäåëåí èäåíòèôèêàòîð %s.\r\n",tmp);
#endif
ERR1=a;
ERR2=i;
i++;
Error(5,tmp);
}
else
if(!isdigit(tmp[0]))
{
label=YES;
ERR1=a;
ERR2=i;
pos=k;
while(AB()!=OK);
break;
}
}
while(string[k]
!= NULL);
if(label==NO)
{
#ifdef TEST
cprintf("Íå
íàéäåí îïåðàòîð GOTO.\r\nÑòðîêà ðàçáîðó íå ïîäëåæèò.\r\n");
#endif
Error(6);
}
a++;
return(OK);
}
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Óäàëåíèå
â ñòðîêå ïðîáåëîâ.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
void Delspace(char*
string)
{
char
str[STR_LEN];
int
j=0;
int
i=0;
while(isspace(string[i])
&& string[i] != NULL)
i++;
for(;string[i]
!= NULL;i++)
{
if(islower(string[i]))
string[i]=toupper(string[i]);
str[j++]=string[i];
}
str[j]=NULL;
sprintf(string,"%s",str);
string[j-1]=NULL;
#ifdef TEST
textattr(30);
clreol();
cputs(string);
textattr(78);
cputs("\r\n");
#endif
}
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Ðåàëèçàöèÿ
íåòåðìèíàëà <Àðèôìåòè÷åñêîå Âûðàæåíèå>.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
int AB(void)
{
#ifdef TEST
cprintf("AB -
Ïðîâåðêà íà Àðèôìåòè÷åñêîå Âûðàæåíèå.\r\n");
#endif
fprintf(errors,"AB
- Ïðîâåðêà íà Àðèôìåòè÷åñêîå Âûðàæåíèå.\n");
Scan();
T();
if(nx=='+')
{
AB();
}
else
if(nx=='-')
{
AB();
}
if(nx==NULL)
return(OK);
else
if(nx!='*' && nx!='/' && nx!=')')
Error(1);
return(YES);
}
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Ðåàëèçàöèÿ
íåòåðìèíàëà <Òåðì>.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
int T(void)
{
#ifdef TEST
cprintf("T -
Ïðîâåðêà íà Òåðì.\r\n");
#endif
fprintf(errors,"T
- Ïðîâåðêà íà Òåðì.\n");
O();
if(nx=='/')
{
Scan();
T();
}
else
if(nx=='*')
{
Scan();
if(nx=='*')
{
Scan();
T();
}
else
T();
}
if(nx==NULL)
return(OK);
else
if(nx!='+' && nx!='-' && nx!=')')
Error(2);
return(OK);
}
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Ðåàëèçàöèÿ
íåòåðìèíàëà <Îïåðàíä>.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
int O(void)
{
#ifdef TEST
cprintf("O -
Ïðîâåðêà íà Îïåðàíä.\r\n");
#endif
fprintf(errors,"O
- Ïðîâåðêà íà Îïåðàíä.\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);
getch();
#endif
fprintf(errors,"IDENT
- Ïðîâåðêà íà Èäåíòèôèêàòîð ñ ñèìâîëà %c.\n",nx);
if(isalpha(nx))
return(NO);
}
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Ðåàëèçàöèÿ
íåòåðìèíàëà <Äðîáíîå Áåç Çíàêà>.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
int FLOAT(void)
{
#ifdef TEST
cprintf("FLOAT
- Ïðîâåðêà íà Äðîáíîå Áåç Çíàêà ñ öèôðû %c.\r\n",nx);
getch();
#endif
fprintf(errors,"FLOAT
- Ïðîâåðêà íà Äðîáíîå Áåç Çíàêà ñ öèôðû %c.\n",nx);
if(isdigit(nx))
{
while(isdigit(nx))
Scan();
if(nx=='.')
{
Scan();
while(isdigit(nx))
Scan();
}
return(YES);
}
return(NO);
}
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Ñêàíèðîâàíèå
ñëåäóþùåãî ñèìâîëà èç ñòðîêè.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
void Scan(void)
{
#ifdef TEST
cprintf("SCAN -
Ñêàíèðîâàíèå. Òåêóùèé ñèìâîë '%c' ñ êîäîì %d.\r\n",STR[pos],STR[pos]);
getch();
#endif
fprintf(errors,"SCAN
- Ñêàíèðîâàíèå. Òåêóùèé ñèìâîë '%c' ñ êîäîì
%d.\n",STR[pos],STR[pos]);
nx=STR[pos];
pos++;
}
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Îáðàáîòêà
îøèáîê.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
void Error(int
num,char* s)
{
char
*E[40]=
{
"Îæèäàåòñÿ '+' èëè '-'",
"Îæèäàåòñÿ '*', '/' èëè '**'",
"Îæèäàåòñÿ ')'",
"Îæèäàåòñÿ èäåíòèôèêàòîð èëè Äðîáíîå áåç çíàêà",
"Íå îïðåäåëåí èäåíòèôèêàòîð ",
"Íå íàéäåí îïåðàòîð GOTO\r\nÑòðîêà ðàçáîðó íå ïîäëåæèò",
NULL
};
sprintf(mes[ERR1][ERR2],"%s%s",E[num-1],s);
fprintf(errors,"––––––––––––––––––––––––––––––––––––––––––––––––––––––––\n");
fprintf(errors,"Error
- Îøèáêà ñòðîêà %d, îøèáêà # %d.\n",ERR1,ERR2);
#ifdef TEST
cprintf("Error -
Îøèáêà: ñòðîêà # %d, îøèáêà # %d.\r\n",ERR1,ERR2);
cprintf("%s\r\n",mes[ERR1][ERR2]);
Beep(1000,200);
getch();
#endif
fprintf(errors,"%s\n",mes[ERR1][ERR2]);
fprintf(errors,"––––––––––––––––––––––––––––––––––––––––––––––––––––––––\n");
ERR2++;
mes[ERR1][ERR2][0]=NULL;
}
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Ïîäêëþ÷àåìûé
ôàéë.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
#include"intface.h" //
Ôàéë ñ ôóíêöèÿìè èíòåðôåéñà.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
// Ó 1997 Áîðçîâ Àíäðåé Hèêîëàåâè÷. E-mail:
ANDREY@RedHouse.nstu.nsk.su.
//¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾
Ëèòåðàòóðà.
1. Êóðñ ëåêöèé ïî ñèñòåìíîìó ïðîãðàììèðîâàíèþ.
2. Ãåðáåðò Øèëäò «C äëÿ ïðîôåññèîíàëüíûõ
ïðîãðàììèñòîâ».
|