Тексты распознающих процедур
function TForm1. Lex_Progr: boolean; // 1. программа begin Lex_Progr: =False; if Code_Tab [i]. Lex='program' then i: =i+1 else // конец блока для PROGRAM begin Err_Synt ('Отсутствует служебное слово program, либо в нем ошибка ', i); Exit; end; if Lex_Prog_Name=false then Exit; // начало блока для имени программы if Code_Tab [i]. Lex='; ' then i: =i+1 else // начало блока для точки с запятой begin Err_Synt ('Отсутствует точка с запятой после имени программы', i-1); Exit; end; if Code_Tab [i]. Lex='var' then i: =i+1 else // начало блока для VAR begin Err_Synt ('Отсутствует служебное слово var после заголовка программы', i); Exit; end; if Lex_descr_list=false then Exit; if Code_Tab [i]. Lex='begin' then // начало блока для BEGIN begin i: =i+1; if Code_Tab [i]. Lex='; ' then begin Err_Synt ('После begin недопустим символ "; "', i); Exit; end; end else begin Err_Synt ('Отсутствует служебное слово begin после описаний переменных', i); Exit; end; if Lex_oper_list=false then Exit; if Code_Tab [i]. Lex='end' then i: =i+1 else // начало блока для END begin Err_Synt ('Отсутствует служебное слово end в конце программы', i); Exit; end; // начало блока для точки if Code_Tab [i]. Lex='. ' then Lex_Progr: =true else if Code_Tab [i]. Lex<>'' then Err_Synt ('После служебного слова END вместо точки находится "'+Code_Tab [i]. Lex+'"', i) else Err_Synt ('Ожидается точка после служебного слова END в конце программы', i-1); end; procedure TForm1. Err_Synt (text: string; l: integer); begin if Error<>true then begin Memo1. Lines [Code_tab [l]. numstr-1]: =Memo1. Lines [Code_tab [l]. numstr-1] +'!!! '+'Error!!! '; Memo2. Lines [0]: =Memo2. Lines [0] +text; end; Error: =true; Exit; end; function TForm1. Lex_Prog_Name: boolean; // 2. имя программы begin Lex_Prog_Name: =False; if (Code_Tab [i]. typ<>'I') and (Code_Tab [i]. Lex<>'; ') then begin Err_Synt ('Неправильное имя программы. Ошибочное выражение: "'+Code_Tab [i]. Lex+'"', i); Exit; end; if Code_Tab [i]. Lex='; ' then begin Err_Synt ('Отсутствует имя программы после program', i); Exit; end; Lex_Prog_Name: =true; i: =i+1; end; function TForm1. Lex_Descr_List: boolean; // 3. список описаний begin Lex_descr_list: =false; Found: =false; while Code_Tab [i]. typ='I' do begin Found: =true; if Lex_descr=false then Exit; if Code_Tab [i]. Lex='; ' then i: =i+1 else begin Err_Synt ('Отсутствует точка с запятой после описания переменных ', i-1); Exit; end; end;; if Found=false then begin Err_Synt ('Отсутствует идентификатор в описании ', i); Exit; end; Lex_descr_list: =true; end; function TForm1. Lex_descr: boolean; // 4. описание begin Lex_descr: =false; if Lex_name_list=true then begin if Code_Tab [i]. Lex=': ' then i: =i+1 else begin Err_Synt ('Отсутствует двоеточие перед типом '+Code_Tab [i]. Lex, i); Exit; end; if Lex_type=true then Lex_descr: =true else Exit; end else Exit; end; function TForm1. Lex_name_list: boolean; // 6. список имен begin Lex_name_list: =false; if Code_Tab [i]. typ='I' then i: =i+1 else begin Err_Synt ('Ожидается идентификатор ', i); Exit; end; while Code_Tab [i]. Lex=',' do begin i: =i+1; if Code_Tab [i]. Typ='I' then i: =i+1 else begin Err_Synt ('Ожидается идентификатор ', i); Exit; end; end; Lex_name_list: =true; end; function TForm1. Lex_type: boolean; // 5. тип begin Lex_type: =false; if (Code_Tab [i]. Lex='integer') then begin Lex_type: =true; i: =i+1 end else begin Err_Synt ('Отсутствует тип: integer ', i-1); Exit; end; end; function TForm1. Lex_oper_list: boolean; // 7. список операторов begin Lex_oper_list: =false; found: =false; while Lex_oper=true do begin Found: =true; if (Code_Tab [i]. Lex='; ') then i: =i+1 else // Если след. лексема после проверенного оператора ни "; ", ни END, а любая другая лексема. if Code_Tab [i]. Lex<>'end' then begin Err_Synt ('Ожидается точка с запятой после оператора (после лексемы '+Code_Tab [i-1]. Lex+') ', i-1); Exit; end; end; Lex_oper_list: =true; if found=false then begin Err_Synt ('Не найдены операторы между begin и end', i-1); Lex_oper_list: =false; end; end; function TForm1. Lex_oper: boolean; begin Lex_oper: =false; if (Lex_assign) or (Lex_repeat_until) then Lex_oper: =true else if (Code_Tab [i]. Lex='; ') and (Code_Tab [i-1]. Lex='; ') then Lex_oper: =true else // проверяется на пустой оператор, т.е. на ";; ". if (Code_Tab [i]. Typ='T') and (Code_Tab [i]. Lex<>'end') and (Code_Tab [i]. Lex<>'begin') and (Code_Tab [i]. Lex<>'; ') then Err_Synt ('Лишняя лексема в программе: '+Code_Tab [i]. Lex, i); end; function TForm1. Lex_assign: boolean; // 10. присваивание begin Lex_assign: =false; if Code_Tab [i]. typ='I' then begin if Code_Tab [i+1]. Lex=': =' then begin i: =i+2; if Lex_Exp=true then Lex_assign: =true else Memo2. Lines [1]: =Memo2. Lines [1] +' в операторе присваивания' end else Err_Synt ('Ошибка в операторе присваивания', i) end; end; function TForm1. Lex_Exp: boolean; // 11. выражение begin Lex_Exp: =false; if Lex_simple_Exp=true then begin if ( (Code_Tab [i]. Lex='=') or (Code_Tab [i]. Lex='>') or (Code_Tab [i]. Lex='<') or (Code_Tab [i]. Lex='<>') or (Code_Tab [i]. Lex='<=') or (Code_Tab [i]. Lex='>=')) then begin i: =i+1; if Lex_simple_Exp=true then begin Lex_Exp: =true; Exit; end; end; end else Exit; Lex_Exp: =true; // если простое выражение без знака end; function TForm1. Lex_simple_Exp: boolean; // 12. простое выражение begin Found: =false; Lex_simple_Exp: =false; if Lex_term=true then begin Found: =true; while ( (Code_Tab [i]. Lex='+') or (Code_Tab [i]. Lex='-')) and (Found=true) do begin i: =i+1; if Lex_term=false then begin Found: =False; Err_Synt ('Ожидается константа, идентификатор или выражение ', i-1); Exit; end; end; if (Code_Tab [i]. Lex=') ') and (Scobka=false) then Err_Synt ('Ожидается открывающаяся скобка в множителе', i) end; if Found=true then Lex_simple_Exp: =true; end; function TForm1. Lex_Term: boolean; // 13. терм begin Found: =false; Lex_Term: =false; if Lex_mnozh=true then begin Found: =true; while ( (Code_Tab [i]. Lex='*') or (Code_Tab [i]. Lex='/')) and (Found=true) do begin i: =i+1; if Lex_mnozh=false then Found: =False; end; end; if Found=true then Lex_Term: =true; end; function TForm1. Lex_mnozh: boolean; // 14. множитель begin Lex_mnozh: =false; if (Code_Tab [i]. typ='I') or (Code_Tab [i]. typ='C') then begin i: =i+1; Lex_mnozh: =true; Exit; end else begin if Code_Tab [i]. Lex=' (' then begin Scobka: =true; i: =i+1; if Lex_simple_Exp=true then begin if Code_Tab [i]. Lex=') ' then begin i: =i+1; Lex_mnozh: =true; end else begin Err_Synt ('Ожидается закрывающая скобка в множителе ', i); Exit; end; end; end else Err_Synt ('Ожидается константа, идентификатор или выражение ', i); end; end; function TForm1. Lex_repeat_until: boolean; // 18. цикл begin Lex_repeat_until: =false; if Code_Tab [i]. Lex='repeat' then begin i: =i+1; if Lex_body=true then begin i: =i+1; if Code_Tab [i]. Lex='until' then begin i: =i+1; if Lex_Exp=true then Lex_repeat_until: =true else Err_Synt ('Ожидается выражение после служебного слова until', i); end else Err_Synt ('Ожидается служебное слово until', i); end; end; end; function TForm1. Lex_body: boolean; // 20. тело цикла begin Lex_body: =false; if Lex_oper=true then begin Lex_body: =true; Exit; end else if Code_Tab [i]. Lex='begin' then begin i: =i+1; if Code_Tab [i]. Lex='; ' then begin Err_Synt ('После begin недопустим символ "; "', i); Exit; end; if Lex_oper_list=true then begin if (Code_Tab [i]. Lex='end') and (Code_Tab [i+1]. Lex<>'; ') then begin Lex_body: =true; i: =i+1; end else Err_Synt ('Ожидается служебное слово end после блока операторов', i-1) end; end; end;
Популярное: Модели организации как закрытой, открытой, частично открытой системы: Закрытая система имеет жесткие фиксированные границы, ее действия относительно независимы... Как вы ведете себя при стрессе?: Вы можете самостоятельно управлять стрессом! Каждый из нас имеет право и возможность уменьшить его воздействие на нас... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (191)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |