|
Тема
|
Регулярен израз за калкулатор ?
|
|
Автор | 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
| |
|
|
|
|