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.
Fórum › PHP
Parsování logického výrazu
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
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).
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
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Navrh logickeho obvodu — založil johnw
Realizacia logickeho obvodu — založil johnw
Pochopení výrazu — založil velurex
Umocnění výrazu — založil zdenek
Vyhodnotenie prijateho vyrazu — založil Tom@sQo
Moderátoři diskuze