CodeNet / Приложения / Алгоритмы / Разбор выражений. Компиляторы и интерпретаторы. / Компилятор пишется так...
Пример 2. Таблица имен.
(**************************************) (* Процедуры для таблицы имен *) (**************************************) const WordLen = 32; TabSize = 1024; MaxKey = 12; Type bloc = string [WordLen]; EnumTag = (Dunno, TagRecord, TagInt); (* Ячейка таблицы имен *) ncell = record Pname : bloc; Tag : EnumTag; Ref : integer; Fields : integer; end; (* Таблица имен *) var TableOfNames : array [1..TabSize] of bloc; TabLen : integer; (* Размер таблицы имен *) procedure IniTab; begin TabLen := 0; PutIn("procedure"); PutIn("main"); PutIn("end"); PutIn("int"); PutIn("record"); PutIn("if"); PutIn("then"); PutIn("else"); PutIn("close"); PutIn("while"); PutIn("do"); PutIn("print"); end; (* Найти переменную с данным именем *) int Find (Name: bloc); var i : integer; begin Find := 0; for i:=MaxKey+1 to TabLen do if Name = TableOfNames [i].Pname; then Find := i; end; (* Создать новую запись таблицы имен с данным именем *) procedure PutIn (Name:bloc); begin TabLen := TabLen +1; With TableOfNames [TabLen] do begin Pname := Name; Tag := Dunno; end; end; (* Если номер записи не больше MaxKey, то это на самом деле не имя, а ключевое слово *) Function KeyEntry (t:integer) : boolean; begin KeyEntry := (t>0) and (tНазад | Оглавление | Вперед