КАТЕГОРИИ: Архитектура-(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; Просмотров: 383; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |