Клубове Дир.бг
powered by diri.bg
търси в Клубове diri.bg Разширено търсене

Вход
Име
Парола

Клубове
Dir.bg
Взаимопомощ
Горещи теми
Компютри и Интернет
Контакти
Култура и изкуство
Мнения
Наука
Политика, Свят
Спорт
Техника
Градове
Религия и мистика
Фен клубове
Хоби, Развлечения
Общества
Я, архивите са живи
Клубове Дирене Регистрация Кой е тук Въпроси Списък Купувам / Продавам 14:00 31.05.24 
Технически науки
   >> Информатика
*Кратък преглед

Тема Регулярен израз за калкулатор ?нови  
АвторAlex (Нерегистриран)
Публикувано21.01.02 17:09



Някой може ли да ми помогне ?

Трябва ми регулярен израз за прости математически изрази.
( с цели числа върши работа )
Но да минават и скобки през него ( балансирани разбира се )

пшримерно :

'-'|d|d* '+' | '-' | '*' | '/' | '(' | '-' | d|d* ')' E... ne mog ada go izmisli veche 2 h.



Тема Re: Регулярен израз за калкулатор ?нови [re: Alex]  
Автор josarjan ()
Публикувано21.01.02 17:45



Не съм убеден, че с регулярен израз ще се оправиш - трябва ти по-сложна граматика. Виж, с КСГ (контекстно свободна) ще стане. Даже ще е от хубавите - гледаш един символ напред и знаеш кое правило да избереш (не си спомням точно как се казваха - LL(1) май). Нещо от този сорт:

E -> S | S '*' E
S -> О | О '+' S
О -> '(' E ')' | Number

или ако го преведем:
Е (израз) е или S (сума) или S '*' E (сума по израз)
S (сума) е или О (операнд ) или операнд + сума
операнд е или израз в скоби или число
Виж за Number (число) ще трябва с регулярен израз.
Не знам доколко е точно това горе (пиша го набързо), но е нещо такова.
Как може да се реализира - ако имаш lex и yacc е лесно.
Ако трябва да пишеш програма и не знаеш как става с таблица (така работи yacc-a) можеш да използваш т.нар. метод на рекурсивното спускане (или май така се казваше).



Тема Re: Регулярен израз за калкулатор ?нови [re: Alex]  
Автор lndependent (crash)
Публикувано21.01.02 18:05



с регулярен израз няма да стане, трябва ти контекстно-свободна граматика. Например граматиката на аритметичните изрази:
E -> T | E + T | E - T
T -> F | T * F | T / F
F -> 4ISLO | ID | ( E )

тук -> означава "поражда", | е знак за дизюнкция (ти си знаеш какво е), 4ISLO и ID се разпознават с регулярни изрази (и тях може да си ги измислиш, ако ти трябват).

Ако лявата рекурсия ти пречи (по метода на рекурсивното спускане влизаш в безкрай рекурсия и алгоритъма забива), я заменяш с итерация:

E -> T | T {+ T}[*] | T {- T}[*]
T -> F | F {* F}[*] | T {/ F}[*]
F -> 4ISLO | ID | ( E )
[*] е знака за празна итерация (звездичка-горен индекс в някои нотации), т.е. може да присъства 0 или повече пъти. така граматиката става разширена контекстно-свободна, но машинната реализация е детска работа.

Аз лично не ти препоръчвам LL(k) анализ. Прекалено сложно става да се строи таблица, изчерпваща всички двойки терминал-нетерминал и съответните им пораждания. Друг е въпросът, че грешките се хващат много лесно - директно от таблицата.
Ако ти трябва литература - "Транслатори и операционни системи" на Боян Янков, много е добра.

BTW да не би да пишеш курсова работа при доц. Бонев?

stoj, ta gledaj


Тема Re: Регулярен израз за калкулатор ?нови [re: Alex]  
АвторLamerSlamer (Нерегистриран)
Публикувано21.01.02 20:35



Мммм... дааа...
Лошо... Много лошо... Колега, защо не четете ?

Мат.изразите се описват с КОНТЕКСТНО СВОБОДНА ГРАМАТИКА>
Ето Ви една такава:

S->E
E->E+T
E->E-T
E->T
T->T*F
T->T/F
T->F
F->d
F->(E)

Такааа ...

Чомски казва, "Ако всички правила са от вида:
X->aY (дясно линейна)
или
X->Ya (ляво Линейна)

където X-нетерминал, а-терминал
За тази граматика има КДА (краен детерминиран автомат)
А едно светило в областа бе доказало, че автоматните и
регулярните езици съвпадат.

Абе изобщо все хубави неща...Кому ли са нужни ?


Все пак УСПЕХ !



Тема Re: Регулярен израз за калкулатор ?нови [re: lndependent]  
АвторAlex (Нерегистриран)
Публикувано21.01.02 20:49



Моляте ! ! !
Прати ми нещо ако можеш.
alexandrina@abv.bg

С този Як и Лекс нищо не направих а сама ще се сбъркам от писане !



Тема Re: Регулярен израз за калкулатор ? [re: Alex]  
Автор lndependent (crash)
Публикувано22.01.02 11:34



ne e 4ak tolkowa trudno. to4no sega oba4e nqmam wreme da pi6a i kalkulator :-). naj-lesno 6te ti byde po metoda na rekursiwnoto spuskane, ne6to ot wida:

char ch;
void E()
{
ch = getchar();
T();
while (ch == '+' || ch == '-')
T();
}

void T()
{
F();
while (ch == '*' || ch == '/')
F();
}

void F()
{
//4ete6 nqkakawa struktura s teku6tata leksema (token), nejniq tip i code
if (token.type == NUM_LITERAL || token.type == ID_LITERAL)
return;
if (ch == '(') //otwarq6ta skoba
{
E();
if (ch == ')') //zatwarq6ta skoba
return;
error("gre6ka wyw whodniq niz!!!");
}
error("gre6ka wyw whodniq niz!!!");
}

getchar() ti wry6ta edin simwol ot whodniq niz, error() otpe4atwa gre6ka.
towa e dosta zawyr6eno kato ideq, move6 da go dorazwie6.
imam edin gotow leksi4eski analizator, no toj e na C# i nqma da ti swyr6i rabota. ako pyk ne ti e mnogo spe6no, 6te se opitam da skalypq ne6to do edna-dwe sedmici, no maj pak 6te byde na C#.

stoj, ta gledaj



*Кратък преглед
Клуб :  


Clubs.dir.bg е форум за дискусии. Dir.bg не носи отговорност за съдържанието и достоверността на публикуваните в дискусиите материали.

Никаква част от съдържанието на тази страница не може да бъде репродуцирана, записвана или предавана под каквато и да е форма или по какъвто и да е повод без писменото съгласие на Dir.bg
За Забележки, коментари и предложения ползвайте формата за Обратна връзка | Мобилна версия | Потребителско споразумение
© 2006-2024 Dir.bg Всички права запазени.