|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Сен 21, 2004 15:24:00 · Поправил: Gromozeka Полмогите, пожалуйста, кто чем может(кто идеями, кто кусочками кода)!!!! Дали задание написать лексичесикй анализатор на ассемблере, а не знаю с чего начинать, нет никаких хороших идей( реализация которы не очень сложная была бы для меня :-) ) Я превожу ниже задание по лабораторной работе с теоретическими ведомостями, что бы вам было легче понять что именно надо мне сделать. В даній роботі пропонується створити лексичний
аналізатор для обробки певної групи машинних команд
персонального комп’ютера згідно з варіантом. Виділення
лексем у символьному тексті програми передбачає наявність
таблиці ключових слів (мнемонік операторів), перелік
розподільників, а також таблицю ідентифікаторів, яка
створюється при першому перегляді тексту програми. При
створенні цієї таблиці разом з ім’ям ідентифікатора
(міткою, змінною або константою) записуються їхні
атрибути та значення (відносні адреси). Під час виконання
другого перегляду ця таблиця використовується для
остаточного формування коду машинної команди. Для
лексичного аналізу необхідно розрізняти, на якому
перегляді (першому чи другому) виконується аналіз. Це
реалізується за допомогою спеціальної змінної, що вказує
на номер перегляду. Аналізатор необхідно створювати на
мові Асемблер. Усі лексеми можна розділити на дві групи:
розподільники та інші лексеми. Для пошуку розподільників
необхідно створити таблицю розподільників для їхнього
пошуку за допомогою команди XLAT. Розподільники в цій
таблиці кодуються ненульовим значенням, а решта символів –
нулем. Фрагмент програми пошуку розподільників з
урахуванням таблиці перекодування розподільників має
такий вигляд.
; прапорець DF - в нулі CLD
; в регістрі SI знаходиться адреса рядка оператора, що
аналізується
; в регістрі BX знаходиться адреса таблиці перекодування
; в регістрі CX знаходиться довжина рядка
M1: LODSB ; черговий символ рядка в AL
XLAT ; перекодування символа
OR AL,AL ; перевірка розподільника
LOOPZ M1 ; продовження пошуку розподільника
; якщо розподільник пробіл то треба організувати пропуск пробілів
; для цього можно використати команду сканування SCACB, а адреса рядка має бути підготовлена в регістрах ES: EDI (DI).
MOV AL, 20H ; код пробілу
REPE SCASB ; сканування рядка
За допомогою цих фрагментів знаходяться адреси
розподільників, між якими розміщуються решта лексем
(ключові слова, константи, ідентифікатори змінних або
констант та інші). Можливе значення лексеми разом із її
типом та мнемонічним її виразом треба занести в таблицю.
Ідентифікатори мають бути підготовлені разом з їхніми
типами та значеннями в таблиці ідентифікаторів при
першому перегляді тексту програми. Значенням при цьому є
внутрішня адреса ідентифікатора (мітки, змінної або
константи). Ключові слова мають бути підготовлені у
вигляді таблиці з вказівкою типу.
Результатом роботи лексичного аналізатора повинна бути
таблиця із такою структурою даних.
Лексема Тип Порядковий N Внутрішнє значення Адреса
DB DW DD DQ DT
Завдання на виконання лабораторної роботи.
1) Обрати свій номер варіанта згідно з порядковим
номером в журналі.
2) Створити блок-схему алгоритму програми лексичного
аналізу згідно варіанту.
3) Скласти програму лексичного аналізу. Програма має
включати таблицю ключових слів – мнемонік операторів
згідно варіанту.
4) Скласти тестовий приклад та показати викладачеві
результати роботи лексичного аналізатору.
5) Оформити звіт та подати його викладачу.
Заранее спасибо!!! |
|
|
Дата: Сен 22, 2004 02:51:10 Что за "таблиці перекодування" ?, может хлат. Объясни четко что нужно чтобы делал этот анализатор ? |
|
|
Дата: Сен 22, 2004 09:36:31 Мое задание сделать лексический анализатор для команд INC та DEC регистра та памяти з адрессным выражением. Таблица перекодировки, как я понимаю, это таблица перкодировки лексем в токены(определенные значения по умолчанию).Строить таблицу лексического анализа, структуру таблицы я уже приводил. |
|
|
Дата: Сен 23, 2004 01:37:32 Каждому слову команды присвоить номер вычисляемый по типу сrс (это для хлата). Какие "выдносни адреса" ? Какие розподильники, токены ? Тебе надо закодировать или декодировать ? Если да то хлат неуметсен. |
|
|
Дата: Сен 30, 2004 11:38:42 Насколько я понял, надо ЛА, который из входного потока распознает INC и DEC, регистры, адреса. В данном случае "Таблица перекодировки" это "таблица переходов". Такой лексический анализатор сделать достаточно просто, инфы полно. Привожу код на сях, потому что это моя старая лаба, а на асме переписывать просто лень: #include <stdio.h>
#include <ctype.h>
char S[100];
int i;
int ST;
int CL;
int FIX;
int D[13][10]={
// 0 1 2 3 4 5 6 7 8 9
{ 2, 1, 1, 1, 4, 3, 7, 9,10,10 }, // 0 - 0
{ 1, 1, 1, 1,-1,-1,-1,-1,-1,-1 }, // 1 - ident
{ 2, 2,-2,-2,-2,-2,-2,-2,-2,-2 }, // 2 - const8
{-3,-3,-3,-3,-3, 5, 6,-3,-3,-3 }, // 3 - +
{10,10,10,10,10,10,-4,10,10,10 }, // 4 - !=
{-5,-5,-5,-5,-5,-5,-5,-5,-5,-5 }, // 5 - ++
{-6,-6,-6,-6,-6,-6,-6,-6,-6,-6 }, // 6 - +=
{-7,-7,-7,-7,-7,-7, 8,-7,-7,-7 }, // 7 - =
{-8,-8,-8,-8,-8,-8,-8,-8,-8,-8 }, // 8 - ==
{ 9, 9, 9, 9, 9, 9, 9,11, 9, 9 }, // 9 - comment?
{10,10,10,10,10,10,10,10,10,-10}, //10 - error
{11,11,11,11,11,11,11,11,12,11 }, //11 - comment?
{11,11,11,11,11,11,11,11,-9,11 } //12 - comment!
};
int W[]={ 1,1,1,0,1,1,1,1,0,0,0 };
char *out[]={"ident ","const8 ","oper + ","oper !=","oper ++","oper +=","oper = ","oper ==","comment","error!!" };
int sclass(char c)
{
switch(c){
case '\n':return(3);
case '0': return(0);
case '8': return(2);
case '9': return(2);
case '!': return(4);
case '+': return(5);
case '=': return(6);
case '(': return(7);
case ')': return(8);
default:
if(isdigit(c)) return(1);
if(isalpha(c)) return(3);
return(9);
}
}
void main(){
char name[30];
FILE *inp;
do{
printf("file name : ");
gets(name);
}
while((inp=fopen(name,"r"))==NULL);
S[0]='\0';
i=0;
ST=0;
while(1){
if((ST==0) && (S[i]=='\0')){
if(fgets(S,100,inp)==NULL){
printf("\n *** work ends ***\n");
return;
}
i=0;
}
if(ST==0) FIX=i;
CL=sclass(S[i]);
ST=D[ST][CL];
i++;
if(ST<0){
int j;
i=i-W[-ST-1];
printf("%s ",out[-ST-1]);
for(j=FIX; j<i; j++) putchar(S[j]);
puts("");
ST=0;
}
}
}
Сложность заключается именно в составлении таблицы переходов, но главное просто разобраться. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.082 |