Parsování logického výrazu – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Parsování logického výrazu – PHP – Fórum – Programujte.comParsování logického výrazu – PHP – Fórum – Programujte.com

 

midnighter@centrum.cz
~ Anonymní uživatel
8 příspěvků
24. 10. 2008   #1
-
0
-

Dobré dopoledne.
Potřeboval bych poradit kde sehnat materiály k vytvoření vlastního parseru. Nejedná se o nic složitého pouze potřebuji rozparsovat
výrazy typu ((podminka1 AND (podminka2 OR podminka3) OR (podminka4 AND podminka5)) NOT (podminka5 AND podminka6)).
Už sem vyzkoušel několik postupů jak si cely vyraz rozdělit do jednotlivych zavorek ale pak sem měl zase problem s podminkami a log operatory.
Na googlu sem narazil na jisty (ne moc obsahově cenny) material o parsovani, kde se autor zmiňuje o tokenech a předpřípravě parsovaného textu a metodách jeho následného parsování. Bohužel všechno je tam popsáno velice teoreticky. Tak pokud byste někdo měl nějaký nápad nebo nějaké materiály tak bych vám byl vděčen kdybyste se semnou o ně podělili.

Nahlásit jako SPAM
IP: 83.240.28.–
KIIV
~ Moderátor
+43
God of flame
24. 10. 2008   #2
-
0
-

parsovani jako takove je hodne teoreticka zalezitost... prakticke ukazky sou pak neskutecne dlouhe...
tokeny sou vesmes vsechny nejmensi "celky"... treba cele cislo 233, operator and operator + ..........
a pak uz to musis nejak zpracovat... na todle jednoduchy asi nebude moc extra pouzit treba redukcni tabulku :D
mozna by nebylo spatne najit si neco o postfixovem zapisu tj nemas 1+1 ale 1 1 + a tak dale

Nahlásit jako SPAM
IP: 80.188.94.–
Program vždy dělá to co naprogramujete, ne to co chcete...
24. 10. 2008   #3
-
0
-

Jestli ty vyrazy nebudou nejak slozite (jen hodnota operator hodnota, tak by to melo byt pomerne jednoduche). Proste to projdes znak po znaku a do pole si budes ukladat jako tokeny nasledujicich typu (jedna hodnota bude jeden token):

- oteviraci zavorka
- uzaviraci zavorka
- logicky operator
- porovnavaci operator
- leva hodnota
- prava hodnota

Tohle si podle zavorek rozdelis do nejake hierarchie (asi 1 - n-rozmerne pole kde n je hloubka nejhlubsiho prvku) a pak uz to projedes a podivas se jak jsou ty podminky splnene nebo ne.

Cele to ale asi bude pomerne pomale, takze pokud by na tom mela viset nejaka zatez, tak radsi vymysli nejake jine reseni. Obece delat interpreter v interpretovanem jazyce neni uplne dobry napad ;)

Polud ti porad unika princip tokenu, tak se podivej na tokenove funkce PHP (v dokumentaci je najdes, vsechny maji token v nazvu).

Nahlásit jako SPAM
IP: 78.102.164.–
Prosím, jestli potřebujete s něčím poradit,zeptejte se na fóru. Jakýkoliv bezdůvodný pokus mě kontaktovat skončí okamžitým přidáním do ignore listu![br][br] Současný počet osob, které to nepochopily: 7
midnighter@centrum.cz
~ Anonymní uživatel
8 příspěvků
24. 10. 2008   #4
-
0
-

Děkuji za nápady a návrhy. O postfixofém zapisu sem sice nic nenašel, ale použil sem zmiňované pole stím že neprocházím znak po znaku hledám vždycky jenom funkcí strpos "(" nebo ")" stím že při každé nové "(" připočítám hloubku a při ")" hloubku odčítám. To co je mezi poslední a předposlední nalezenou závorkou ukládám do posle $parsed[$deep][]; Do pole parsed[$deep-1][] ukladám pak jakoby odkaz na pole vyžší hloubky a prvek kterým se má začít.
Všechno tak vypadá třeba následovně:

Array ( 

[1] => Array (
[0] => item=1 OR item3=2
[1] => item2=4 NOT bla bla
)
[0] => Array (
[0] => 10
[1] => AND
[2] => 11
)
)


Kod 10 nebo 11 značí že se bude na dané místo patří podmínka z 1ho pole a číslo prvku 0 nebo z 1ho pole číslo prvku 1
Tak kdyby někdo s něčím podobným potřeboval poradit nebo měl problem. Kontaktujte mě na maila a ja vam klidně pošlu zdrojak

Nahlásit jako SPAM
IP: 83.240.28.–
Osiris0
Stálý člen
25. 10. 2008   #5
-
0
-

Pokud umí PHP volat externí knihovny, tak si jednoduše naprogramuj parser v lex/yacc, to je práce tak na 10 minutek...

Nahlásit jako SPAM
IP: 85.70.130.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 21 hostů

Podobná vlákna

Umocnění výrazu — založil zdenek

Vyhodnotenie prijateho vyrazu — založil Tom@sQo

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý