Средства за описание на синтаксиса



Дата27.09.2016
Размер208.86 Kb.
#10924
Средства за описание на синтаксиса

  1. Бакхусови нормални форми (Бакхусова нотация).

Всяка дефиниция в тази нотация може да съдържа метаезикови променливи, константи, метаезикови съюзи.

Метаезикови променливи:

Това са понятия, които са наименования на някакви синтактични единици. В правилно генерирано изречение на описвания език тези променливи не могат да се заменят, трябва да се заместят с езикови константи. За да се отличават от останалият текст, метаезиковите константи се означават с ъглови скоби: , . Метаезиковите променливи се наричат още нетерминални символи на дефиницията, т.е. не спират (не терминират) развитието на граматичната форма по това правило.



Езикови константи:

Елементи на описваният език. Те се пренасят без промяна в генерираната езикова форма. По тази причина носят името дефиниция.



Метаезикови средства:

Те се използват за свързване на променливи и константи, така че дефиницията да бъде по-лесна и четлива.

Използват се следните съюзи:

::=” – “това е”, “по дефиниция е”

| – “или”

стр.1/б


Когато два елемента от една дефиниция са описани един след друг се счита, че между тях е записан съюза (?)

Всяка Бакхусова дефиниция се състои от глава, която е метаезикови променливи, чийто смисъл дефиницията пояснява и тяло, представено от равностойни алтернативи, последвано от съюза “или”, всяка алтернатива представлява изброяване на елементите, които я изграждат.

Числа с цяла и дробна част:

цифра ::= 0|1|2|3|4|5|6|7|8|9

Всяка от алтернативите е езикова константа.

цяло число без знак ::= цифра|цяло без знак цифра


правилна дроб ::= . цяло без знак
десет. число ::= цяло без знак правилна дроб

Тази нотация не е удачна за езици, които съдържат голям брой опционни и алтернативни форми.

Във връзка с това за описанието на езиците PL и KOBOL са направени добавки. Получената интерпретация се нарича PL-ова или KOBOL-ова нотация.

Добавки:

Стр.1б/2


Азбука на C, МОДУЛА2 и АДА

Основна азбука:

Всеки език за програмиране има основна азбука и тя включва минималният обем от символи на някаква кодова таблица, които са ни необходими, за да може да бъде записана произволно сложна програма.

Изваждането на дори един символ води до ограничаване в езика.

Разширена азбука:

Тя включва в себе си задължително основните и всички останали символи от използваната кодова таблица символи, които не принадлежат на основната могат да се използват само в компютри и в текстови данни. На всяко друго място тяхното използване е неправомерно и компилатора сигнализира за това със съобщение за грешки или прави автоматично трансформиране към някакъв синоним.


Пример: В PASCAL голямо и малко а не се различават – те са едно и също нещо.
МОДУЛА2 и С работят с малките и големите букви на латиницата (те са чувствителни към малка и голяма буква – за езика те са различно нещо)

АДА работи само с големи букви – малките са им синоними.

COBOL работи само с големи букви.

В качеството си на цифри всеки от горепосочените езици използват от 0 до 9 за десетични цифри. От А голямо до F голямо за шестнадесетична бройна система. С разрешава използването от малко а до F.

Специалните знаци от езиците се делят на:

  • знаци за операция (+,-,*,…)

  • ограничители – ограничават някакъв синтактичен елемент и го отделят от останалият текст

  • разделители – използват се от програмиста по неово усмотрение, т.е. не се регламентират от синтаксиса и имат за задача да направят синтактичните елементи разбираеми за компилатора.

Стр.3

Всеки специален знак играе ролята на разделител  ние си слагаме такъв.

В качество на разделители се използват:


SP

Space

CR

RETURN (Carriage Return)

Освен тях С допуска още:




LF

Line Feed

TAB

Табулация

VT

Вертикална табулация

Петте общо носят името бели space-ове (разделител)

Те нямат графичен образ, а се отработват от компилатора на езика все едно, че е записан space (SP).

Към азбуката на МОДУЛА2:

#  < > (знак за неравенство)

&  AND


Към азбуката на МОДУЛА2:

#  < > (знак за неравенство)

&  AND
В езика С управляващите кодове на ASCII (аски) кодовата таблица се записват с т.н. ESC-последователности (ЕСКЕЙП-последов.).

Всяка ESC-последователност започва с обратна наклонена черта, която се следва от един или повече знаци. Разрешените последователности са:


\n

LF

\r

CR

\t

TAB

\v

VT

\b

Backspace

\a

Bell

\f

Form Feed

Освен това още се ползват:




\’

Единична кавичка

\’’

Двойни кавички

\?

Въпросителна

\\

Обратна наклонена черта

Втората група ESC-последователности се прилага в случай, когато при употребата на обратно наклонена черта се получава двусмислие (ако не се напише тази черта).

“abc”def”
“abc\”def”

Последната трета група:




\ddd

ASCII код на символ, записан чрез три осмични цифри

\xdd

ASCII код на символ, записан чрез три шестнадесетични цифри


Пример: кода на CR е 13 e \x0D

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


Пример: \A – това си е просто буквата A
Основни синтактични елементи (лексеми).

Програма – съвкупност от имена и константи.

  1. Имена (идентификатори)

Последователност от букви и цифри, започваща с буква. Отделните езици могат да разрешат използването на специални символи (знак за подчертаване, ?, $), които винаги имат тълкуването като буква.
Пример: С и АДА разрешават използването на знака за подчертаване. Езика COBOL допуска използването на минус (но името не може да започва с минус).
Броят символи, които изграждат името най-често не се ограничават в езика, но може и да бъде ограничен, като например в езика С, където само първите 31 символа са значещи, а останалите се игнорират; или COBOL, където името не може да съдържа повече от 31 символа.
Пример: В Turbo PASCAL има ограничение от 63 символа.
От гледна точка на програмиста имената се делят на:

а) ключови думи – те имат специален смисъл във всеки език. Най-често са резервирани и не могат да се ползват за други цели



  • във С ключовите думи се записват с малки букви

  • в МОДУЛА2 с големи

  • в АДА – безразлично. Най-често с малки

б) стандартни – имена, които са познати на езика. Програмиста може да ги ползва без никакви допълнителни пояснения. Не са резервирани  могат да бъдат ползвани и по друг начин  като се загуби предлаганата стандартна услуга

в) библиотечни – не са познати на езика, но са описани в някакви библиотеки. Програмиста може да се ползва от техните услуги като посочи съответната библиотека

г) потребителски – избират се от програмиста за означаване на различни елементи от програмата. Програмиста е длъжен за всяко свое име по съответен начин да покаже на компилатора какво крие под това име.


  1. Константи

стр. 5

а) именувани константи - от гледна точка на синтаксиса, това са имена, които на подходящо място програмиста е свързал с постоянна стойност. При това може да е указал тип (и тогава константата е типизирана) или да не е указал тип (тогава константата е обикновена), типа и се избира от компилатора по начина на записване или по други правила.

б) литерални (истинските константи) – стойността и типа йм произтича от начина по който са записани.


    1. Числови цели константи

МОДУЛА2 и С разрешават използването на три бройни системи за записването на цели константи

  • десетична

  • осмична

  • шестнадесетична

Като в МОДУЛА2 се използва суфиксен метод за записване, а в С префиксен.

Осмични цифри …

Шестнадесетични цифри последвани от буквата В.


цифраС

0цифра

осмично

цифраВ

0xцифра

16-чно

Суфикса С се използва за записване на ASCII-кода на някакъв символ. Всяка константа в С получава тип и той може да бъде int или long в зависимост от стойността на числото. Числа, които са записани в 8-ен или 16-ен тип също получават тип int или long, но ако в старшият бит (разряд) на числото попадне значеща цифра, то тогава типът е unsigned int или unsigned long.



Допълнителният код се изчислява по тази функция

n – дължина на разрядната решетка (ако е отрицателно)


7




0













1 байт



Беззнаков тип – паметта, която е заделена се разглежда като едно цяло положително число.




0

+

127




128



255

0




127




-128




-1




за + или - числа










за – числа или +




един байт

От 0 до 127  128 кодови операции  кода на числото съвпада с кода на положителното число.

От 128 до 255 има 128 кода

По формулата 2n+x

От горе на схемата  кодовете

От дилу  диапазоните с определени числа.

Чрез допълнителният код можем да представим от 2n-1 до 2n-1-1 – този диапазон от числови стойности.

За всички положителни числа0, за всички отрицателни единица.







7




0

+ число

0







– число

1










1 байт



Ако числото е отрицателно, то ще започва с 1ца и кода …

Ако данната е беззнакова, то разредната решетка е в двоичен код, а ако е знакова кода е допълнителен.

Програмиста може да управлява избиране на дълго (long) и беззнаково представяне със суфикси L,l и U,u. Разрешено е едновременното използване на двата суфикса.


Пример: четири различни числа:


13

2 байта

13L

4 байта – двойна дължина

13U




13LU







    1. Константи с плаваща запетая:

Две форми на представяне - фиксирана и експоненциална форма.

  1. фиксирана – състои се от цяла и дробна част

  2. експоненциална – включва и експонента, която започва с буквата е. С допуска и малко е. За МОДУЛА2 и АДА наличието на десетична точка е задължително, а за С не е ако има експоненциална част. Цялата част и дробната част 0 и дробната част 0 в С могат да се пропускат. За вътрешно представяне в езика С се използва IEEE 754 стандарта с къса (4 байта) и дълга (8 байта) част, която се разпределя така:

Къса:




Е

М




8p

23p

Когато Еg е = 127, числото е 0.


Къс формат (4 байта):

+  0


–  1

Е=Eg+127
1|M|<2  нормализирана мантиса, започва с водеща единица.

Точност: 7 до 8 десет. цифри.

Диапазон: 3.4Е-38 до 3.4Е38


Дълъг формат (8 байта):




Е

М







52

Диапазон: 1.7Е-308 до 1.7Е308

Точност: 15 до 16 цифри

+  0


–  1

Е=Eg+1023

1|M|<2  нормализиран вид
Ако няма специално предписание, всички константи са тип double, а ако имат суфикс може и тип float.

Броя байтове х 2  max брой значещи цифри



    1. Символни константи:

Произволен символ, заграден в единични кавички. С допуска в кавички (апостроф) да се загради ESC-последователност. За МОДУЛА2 и АДА сивмолна константа е по същество символа, който представя, а за С тя може да бъде и числова стойност и това е стойността на отговарящият ASCII код, ако тази константа участва в изчисляването на някакъв аритметичен израз.

    1. Низова константа:

Произволна последователност от символи, заградени от кавички. МОДУЛА2 допуска използването на апостроф, както PASCAL. За МОДУЛА2 и АДА низова константа е текста, който тя представя. За С всяка текстова константа е по същество адрес, където се разполага адреса на първият байт.


“abc”

a

b

c

0

”abc”

При това в С всички символни константи се записват с 1 байт повече, който се записва нулево-терминиращ символ.

“abc” е адрес  можем да правим индексация  всеки низ може да се индексира и се извършва индекс операцията.


    1. Указателни константи:

1) Именовани константи

Nil, NULL, null – нулев адрес, константа с характерен адрес, който е – на нула.

  1. Логически константи

FALSE < TRUE - първото е лъжа, второто истина

Езикът С няма логически данни.



  1. Коментари.

За МОДУЛА2  (* …… *)

Допуска се влагане на произволно ниво. В С не се разрешава влагане на коментар.

За С  /* …….*/

// …… CR


Концепция на данните

  1. Тип на данните:

Определя се от множеството стойности, които една данна може да приеме и множеството допустими операции върху тях.

  1. Съвместимост на данните:

Данните, които могат да участват в общи операции се наричат съвместими. Тук под операция не трябва да се има предвид само примитивни операции от типа +,-,… а по-общи взаимодействия, които налагат транспорт на данни от една към друга, например присвояване, заместване на елемент и др. Ако данните не са съвместими за да се участва в операциите трябва да се осъществи преобразуване. Има два вида:

  • конвертиране – извършва се преизчисляване на едната данна, като най-често променя нейното вътрешно представяне, за да се постигне формата на вътрешно представяне на другата данна

  • трансформиране (квалифициране) – без да се променя разрядната решетка на изходната данна тя се тълкува от гледна точка на целевият тип


Типизирани езици

Въведение:

Всички езици следят за съвместимост на данните. Една част от тях (либералните езици) има и йерархия на типовете и в случай, че се открие несъвместимост, компилатора залага скрито от програмиста преобразуване, което е подчинено на база йерархията.

Други езици съобщават за несъвместимостта, като не реализират никакви действия за нейното възстановяване. Тези езици се наричат типизирани езици. Ако езикът не допуска абсолютно никаква съвместимост  има строга типизация (АДА).

Либерален език  С

Слабо типизиран език  PASCAL

Отчасти типизиран  МОДУЛА 2

Строго типизиран  АДА

Структура на С програми
Програмата в С се състои от функции. Те могат да бъдат само глобални, т.е. не се допуска влагане. Функциите могат да бъдат разположени в един или повече файлове. Когато са в повече файлове обикновено се налага използването на декларации и директиви на предпроцесора.

При работа с данни дефиниция означава заделяне на памет плюс възможност за нейната инициализация. При декларацията се описват само свойствата на данните или характеристиките йм без да се заделя памет и без да има възможност за инициализация.

При функциите дефиниция означава да се разгърне тялото на функцията, а декларация да се даде типът на връщаната от функцията стойност, името й и по желание – типът на формалните параметри на функцията.

Всички функции в С по подразбиране връщат стойност от тип int. Ако това подразбиране се запазва, не е необходима декларация на функцията. Ако се налага промяна на връщаната стойност трябва да има задължителна декларацияпреди използването на функцията или функцията да се дефинира преди да се използва.

Използването на декларациите е необходимо, когато се работи с повече от един програмни файлове.

стр.10а


Една функция в С, която е със специално предназначение – main. Това е главната програма и на нея OS (операционната система) предава управлението при стартиране на програмата.

Връщаната стойност от main означава връщан код на грешка. Функцията main или няма параметри или има три:




argc

Цяла данна, която е равна на броя на параметрите на функцията main+1 и всеки един от този масив сочи към текущият параматър

argv

Представлява масив от указатели, големината на който е argc

envp

Променлива, която съхранява информация за средата



set както в DOS

Тези параметри се подават от командният ред на DOS към програмата.


Пример:

#include

int x=1;

int y=2; //Инициализация на променливите

void main()

{

int z;



int w;

z=y+x;


w=y-x;

printf(“z=%d\n w=%d\n”,z,w);

}
предпроцесор – проста текстообработка преди компилация

include  включва съдържанието на файла вътре в <…>

void  тип на връщаната стойност (в случая функцията не връщас стойност)
file1.c
#define ONE 1

#define TWO 2

extern int mymax(int,int);

main ()


{

int w=ONE, x=TWO,y=3;

int z=0;

z=mymax(x,y);

w=mymax(z,w);

}
file2.c


int mymax (int a,int b)

{

if (a>b)



return (a);

else


return (b);

}
Декларатори (декларации)


стр.12

extern  клас памет

типов спецификатор - той показва типа на даннитеили типа на връщаната от функцията стойност

декларатор – с негова помощ се декларират имена на данни, функции, указатели, масиви

=инициализация – ако присъства задава начална стойност на данните. употребата му е тясно свързана с класовете памет

,декл... – това може да се повтори много пъти
Типов спецификатор
стр.12

Кога се използва void ?



  1. при връщане стойност на функция  означава функцията не връща стойност

  2. като формален параматър  няма формални параметри

  3. като указател към произволен тип данни void *

Вътрешно представяне на целите числа е в двоична бройна система, като положителните са в прав код, а отрицателните в допълнителен код. Допълнителният код на положителните числа съвпада с двоичният код на числото, като водещият (старшия) бит е равен на нула. Отрицателните числа в допълнителен кодса със старши бит равен на единица, като допълнителният код се получава от двоичния код на числото, като се инвертират от ляво на дясно до последна единица (без нея).

Преобразуването в двоичен кодна целите данни става чрез последователно целочислено делене на 2 (основата на бройната система) и взимане на остатъците на тези деления в обратен ред.
-1510111100012

15 00001111

+ 11110000

1

…………………………
Видове данни
Най-широко разпространение е намерила клас-функцията, която взема за основа множеството стойности и архитектурата на данните. От тази гледна точка данните делим на:

Данни:


  1. Скаларните: дискретни; реални; низове

  • дискретните: цели; ограничени; изброени

  • изброените: логически; символни; изброени на програмиста

  1. Сложните: масиви; записи; множества; файлове; обекти; задачи

  2. Посочващи: указатели; подпрограмни данни

  • указателите: типизирани; нетипизирани

Особеното за дискретните данни е, че те притежават вътрешна подреденост (вътрешна номерация). Най-често тази номерация започва от нула, но това не е задължително, например за данните от цял тип и ограничените данни.

Вътрешният номер на данната е програмно достъпен чрез използване на различни средства за квалифициране.

Фиксираните реални данни обикновено не се образуват от алгоритмичните езици. Те се отличават с постоянна дискретност на представимите числа за разлика от нормалните реални данни (от PASCAL), където дискретността е променлива и расте при по-големите числа.


0.01,0.02 . . . . . 0.98,0.99

Това са данни (точни данни)  свойствата йм съвпадат със свойствата на целите числа


В езика С низовете са под съмнение към класифицирането на скаларните данни.

От гледна точка на това какво програмиста трябва да направи в програмата си за да създаде някаква данна, данните деления са стандартни и потребителски.

Езика АДА предлага по-добра класификация.

Стандартни данни: познати са на езика и на компилатора, като множество стойности и множество операции и се предлагат на програмиста чрез някакво име на тип.


  • подтипове  това са данни, производни на някакъв базов тип. Те наследяват от родителският тип множеството операции и са съвменстимо с него при всякакъв тип операции.За тези данни програмиста може да създаде име на тип, което да ползва или трябва да реализира уточняване на родителският тип

  • производни данни  те се създават възоснова на някакъв базов тип. Наследяват от родителският тип множество стойности и множество операции, но не са съвместими с него. Програмиста трябва да създаде име на тип за такива данни

  • анонимни данни  те нямат тип, защото се описват със своята архитектура (най-често със сложни данни) при създаването на самата данна. Към данната като цяло езикът може да предложи някакви операции. Например: инициализация на анонимен масив. Към компонентите най-често се предлагат операциите разрешени за техния тип

  • скрити данни  За тези данни от някакъв програмен пакет се предлага: име на тип и множество операции, които програмиста може да ползва само ако окаже името на пакета. В С няма скрити данни


Структура на програмата в МОДУЛА2
МОДУЛА2 е доразвитие на езика на PASCAL и е създаден от автора на PASCAL, поради което запазва всички идеи, които само доразвива до модулен принцип.

Програмата изглежда по следният начин:


MODULE име;импорт;блок име.

Program име; Uses . . .; блок.


Блока в МОДУЛА2 е съставен от раздели, като по подобие на Turbo Pascal няма ред на следването йм и всеки раздел може да се срещне произволен брой пъти, т.е. разделите могат да се доизграждат.

Раздел Label липсва, МОДУЛА2 няма оператор goto.

Последен е винаги раздела на операторите.

стр.15а,16



Структура на програмата в езика АДА
АДА езика произхожда от PASCAL и запазва неговите идеи, но се отказва от разделното изграждане на програмата.

Самата програма е процедура без параметри, чието име е познато на операционната система. Тялото на тази процедура се състои от две части: част описание (съдържа двата вида описание, които могат да бъдат наречени основни и допълнителни (първични и вторични) и изпълнима част.

Към групата на основните  програмиста трябва да създаде свои типове и свои данни.

За създаване на типове се предлагат две средства:



  1. Създаване на потребителски подтип

стр.16а

Пример: subtype int is Integer
Ако прекъснем тук  тип int замества Integer

Ако продължим  subtype int is Integer range 1..1000;

Ограниченията са за:


  • област, фиксирана запетая, плаваща запетая, индекс на област и дискриминанта

  1. Създаване на съвсем нови типове

стр.17

Дискриминатната част се използва само при записите.

Когато говорим за особени моменти ще описваме типовете в…

Може да се опишат следните типове:



  • изброен тип

  • цял тип

  • реален тип

  • масив

  • запис

  • указател

  • производен тип

  • скрит тип


Как се създават данни?

стр.17


i,j: Integer;  в PASCAL

i,j: Integer range 1..150;  в АДА

1..150  ограничението


Структура на програмите в езика COBOL
Компоненти на COBOL програмата:

Фраза – съвкупност от имена и литерали, предствалява описание на свойство

Оператор - съвкупност от имена и литерали, започва винаги с глагол, има заповеден характер

Статия – съвкупност от фрази, която завършва с точка. Статията е описание на някакъв програмен елемент

Изречение – група оператори завършени с точка

Параграф – представлява групиране под общо име на определено множество статии или изречения. Има следната синтактична диаграма:

стр.17а


Секция 

стр.18


Всяка секция е групиране на определено множество статии или от определено множество от параграфи.
Програмата се състои от две части:

  1. описателна

  2. изпълнителна

Описателната част е по същество архитектурно фиксирана (тя трябва да съдържа определени секции и параграфи и то в строго определен ред, ако програмата желае да има определени възможности.

Архитектурно раздвижване може да има само в изпълнителната част, където програмиста може да ползва секция, но не е длъжен. Всички оператори обаче трябва да бъдат под управлението на параграф, т.е. програмата трябва да се състои от поне един параграф.



Ако поне един параграф е в пределите на някаква секция, то всички параграфи трябва да са в пределите на някакви секции.

Типове спецификатори:


ТИП

ПАМЕТ

ДИАПАЗОН





































Каталог: files -> tu files
tu files -> Увод в компютърната графика
tu files -> Xii. Защита и безопасност на ос
tu files -> Електрически апарати
tu files -> Stratofortress
tu files -> Начало Решаване на проблеми
tu files -> Писане на скриптове за bash шел : версия 2
tu files -> 6Технологии на компютърната графика 1Модели на изображението
tu files -> Z=f(x), където x- входни данни; z
tu files -> Body name библиотека global Matrix imports (достъп по име) … var m[N, N] := … end decl., proc … resource f final code imports node, Matrix end name var x: node node; if x … Matrix m[3,4] :=: … end


Сподели с приятели:




©obuch.info 2024
отнасят до администрацията

    Начална страница