Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Лекция 8. Перед вызовом stml( ) выполнялось dconst( )




 

8) STML → STAT (‘;’ STAT)*

 

 

Перед вызовом stml() выполнялось dconst(). В начале этой функции есть exam(‘;’). При успешной проверке вызывается get(), и она возвращает новую лексему.

 

void stml()

{

stat();

while (lex = = ‘;’)

{

get();

stat();

}

return;

}

 

9) STAT → iden ‘=’ EXPR | readl iden | pritl EXPR | retrl EXPR | ifl EXPR thenl STML endl | whilel EXPR dol STML endl

 

 

 

Перед вызовом stat() “свежая” лексема есть. В зависимости от ее значения идет разветвление по switch (lex).

void stat()

{

switch (lex)

{

case IDEN: get(); exam (‘=’); expr(); break;

case READL: get(); exam (IDEN); break;

case PRITL: get(); expr(); break;

case RETRL: get(); expr(); break;

case IFL: get(); expr(); exam(THENL); stml(); exam(ENDL); break;

case WHILEL: get(); expr(); exam(DOL); stml(); exam(ENDL); break;

default: printf(“Синтакс. ошибка в stat в строке nst=%i \n”, nst);

}

return;

}

 

10) EXPR → [‘+’|’-’] TERM ((‘+’|’-’)TERM)*

 

 

 

//“Свежая” лексема есть

void expr()

{

if (lex = = ‘+’ || lex = = ‘-‘)

get();

term();

while (lex = = ‘+’ || lex = = ‘-‘)

{

get();

term();

}

return;

}

 

11)TERM→FACT ((’*’|’/’| ‘%’)FACT)*

 

 

//Есть «свежая» лексема

void term();

{

fact();

while(lex = =’*’||lex = =’/’||lex = = ‘%’)

{

get();

fact();

}

return;

}

 

12) FACT →‘(’EXPR’)’|numb| iden [‘(‘[FCTL]’)’]

 

 

void fact()

{

switch(lex)

{

case ‘(’: get(); expr();exam(‘)’); break;

case NUMB: get(); break;

case IDEN: get(); if(lex = =’(‘)

{

get();

if(lex!=’)’)

fctl ();

exam(‘)’);

}

break;

default: printf (“ Ошибка синтаксиса в fact. lex =%d номер строки

nst=%d \n”,lex, nst);

}

return;

}

 

Функция fact() всегда вызывается после get(). Следовательно, есть новая лексема. В зависимости от ее значения происходит переход на одну из трех ветвей. В любой из них вначале вызывается get(), чтобы получить следующую лексему. Затем происходит анализ в соответствии с регулярными выражениями и синтаксической диаграммой.

 

13)FTCL →EXPR(‘,’EXPR)*

 

 

 

//Есть новая лексема

void fctl()

{

expr();

while(lex = = ‘,’)

{

get();

expr();

}

return;

}

 




Поделиться с друзьями:


Дата добавления: 2015-06-27; Просмотров: 357; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.009 сек.