Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

лексический анализатор для стороки sq;

31K
28 октября 2008 года
charizma
29 / / 28.10.2008
Чето не совсем могу сообразить как начать писать анализатор для строки "SELECT name, hj, FROM mytable GROUPBY agу HAVING age < 20;"(на джаве). просто алгоритм.
please
31K
28 октября 2008 года
charizma
29 / / 28.10.2008
ПЛИЗЗЗЗЗЗЗ. помогите бедной девушке.
11K
29 октября 2008 года
zuze
84 / / 07.03.2008
Формируем таблицы исходных данных
1. Таблица «ключевых слов»:
SELECT, FROM, GROUPBY, HAVING
2. Таблица «служебные знаки»:
',', '<', ';'
3. Таблица «Другие лексемы»:
name, hj, mytable, age, 20

Лексический анализ заключается в том что каждая строка представляется ввиде комбинации двух цифр (номер таблицы и номер строки в таблице) для каждого элемента строки.

Приведу простой пример:

1 таблица

Номер Элемент
1 Program
2 integer

2 таблица

Номер Элемент
1 ,
2 ;

3 таблица

Номер Элемент
1 zuze1
2 zuze2

Количество строк в таблице сколько угодно

Вот я ввожу строку например такую

program zuze2;

Это строка после лексического анализа

(1,1) (3,2) (2,2)
31K
29 октября 2008 года
charizma
29 / / 28.10.2008
zuze , спасибо. но как бы можно чуть поподробнее. как будут формироваться пары цифр - будет просматриваться таблица пока не найдется таблица с этим символом. А как я могу сформировать 3 таблицу, усли по условия между select и from могут быть любые слова(названия атрибутов), главное что б не было цыфр в названии атрибута. т.е. пользователь может ввести какие захочет атрибуты и прога должна это схавать. Я уже так запуталась. Ща вот сижу мучаюсь делаю через if . но это мне кажется тупо
11K
29 октября 2008 года
zuze
84 / / 07.03.2008
Вот код к сожалению он на Borlabd С++ Builder надеюсь Вы знаете С++

Прошу прощения у "Модераторов" за то что я написал код на С++,
так как лексический анализатор можно написать на любом языке, но к сожалению я язык Java не знаю.


Код:
//--------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//--------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//--------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
StringGrid1->Cells[0][0] = "Номер";
    StringGrid1->Cells[1][0] = "Элемент";
    StringGrid2->Cells[0][0] = "Номер";
    StringGrid2->Cells[1][0] = "Элемент";
    StringGrid3->Cells[0][0] = "Номер";
    StringGrid3->Cells[1][0] = "Элемент";
}
// Открыть таблицу "ключевых слов"
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    if (OpenDialog1->Execute())
    {
       TStringList *slist = new TStringList();
       int j = 0;
       slist->LoadFromFile(OpenDialog1->FileName);
       for (int i = 1; i <= slist->Count; i++)
       {
           StringGrid1->Cells[0] = i;
           StringGrid1->Cells[1] = slist->Strings[j];
           j++;
       }
       delete slist;
    }
}
//--------------------------------------------------------------

void __fastcall TForm1::Button4Click(TObject *Sender)
{
    if (OpenDialog2->Execute())
    {
       TStringList *slist = new TStringList();
       int j = 0;
       slist->LoadFromFile(OpenDialog2->FileName);
       for (int i = 1; i <= slist->Count; i++)
       {
           StringGrid2->Cells[0] = i;
           StringGrid2->Cells[1] = slist->Strings[j];
           j++;
       }
       delete slist;
    }
}
//--------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
     if (OpenDialog3->Execute())
        Memo1->Lines->LoadFromFile(OpenDialog3->FileName);
}
//--------------------------------------------------------------

void __fastcall TForm1::Button5Click(TObject *Sender)
{
    if (OpenDialog4->Execute())
    {
       TStringList *slist = new TStringList();
       int j = 0;
       slist->LoadFromFile(OpenDialog4->FileName);
       for (int i = 1; i <= slist->Count; i++)
       {
           StringGrid3->Cells[0] = i;
           StringGrid3->Cells[1] = slist->Strings[j];
           j++;
       }
       delete slist;
    }
}










//--------------------------------------------------------------

void __fastcall TForm1::Button3Click(TObject *Sender)
{
     // Количество итераций в цикле столько, сколько
     // строк в исходном коде
    for (int i = 0; i < Memo1->Lines->Count; i++)
    {//1
         AnsiString temp = "";
         AnsiString str = Memo1->Lines->Strings;
         char *tempstr = str.c_str();
         Memo2->Lines->Add("Анализ строчки: "+IntToStr(i+1));
         // Количестово итераций в цикле столько,
         // сколько символов в строке
    for (int j=0; j<(Memo1->Lines->Strings).Length(); j++)
    {//2
        // Проверяем является ли символ
        // буквой или цифрой
        if (isalnum(tempstr[j]))
        {//3
            temp += tempstr[j];
            // Проверка символа в таблице "Ключевых слов"
            for (int k = 1; k < StringGrid1->RowCount; k++)
            {//4
                // Находится в таблице "ключевых слов"
                if (StringGrid1->Cells[1] [k] == temp)
                {//5
                   Memo2->Lines->Add("(1,"+
   StringGrid1->Cells[0] [k]+") ");
                   temp = "";
                }//5
                else
                {
                   if (k == StringGrid1->RowCount-1)
                     Memo3->Lines->Add("Элемент: "+temp+
 " в таблице \'Ключевых слов\' нет");
                }
            }//4
            // Проверка символа в таблице "Другие лексемы"
            for (int k = 1; k < StringGrid3->RowCount; k++)
            {//6
                // Находится в таблице "Другие лексемы"
                if (StringGrid3->Cells[1] [k] == temp)
                {//7
                   Memo2->Lines->Add("(3,"+
   StringGrid3->Cells[0] [k]+") ");
                   temp = "";
                }//7
                else
                {
                   if (k == StringGrid3->RowCount-1)
                     Memo3->Lines->Add("Элемент: "+temp+
 " в таблице \'Другие лексемы\' нет");
                }
            }//6
        }//3
        else
        if (tempstr[j] != ' ')
        {//8
           temp = "";
           temp += tempstr[j];
           if ((tempstr[j] == ':' || tempstr[j] == '>' ||
                  tempstr[j] == '<') && tempstr[j+1] == '=')
             temp += tempstr[j+1];
            // Проверка символа в таблице "Служебные знаки"
            for (int k = 1; k < StringGrid2->RowCount; k++)
            {//9
                // Находится в таблице "Служебные знаки"
                if (StringGrid2->Cells[1] [k] == temp)
                {//10
                   Memo2->Lines->Add("(2,"+
   StringGrid2->Cells[0] [k]+") ");
                   temp = "";
                }//10
                else
                {
                   if (k == StringGrid2->RowCount-1)
                     Memo3->Lines->Add("Элемент: "+temp+
 " в таблице \'Служебные знаки\' нет");
                }
            }//9
            temp = "";
        }//8
    }//2
}//1
}
//--------------------------------------------------------------
31K
29 октября 2008 года
charizma
29 / / 28.10.2008
thanks. надеюсь получиться чето. еще раз спс
43K
04 ноября 2008 года
leska
4 / / 04.11.2008
Если это не лаба, то можно посмотреть в сторону генераторов парсеров типа ANTLR and JavaCC.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог