/ / Aký je dobrý generátor syntaktických súborov pre php? - php, syntaktická analýza, generátor, dsl

Čo je dobrý generátor parserov pre php? - php, parsovanie, generátor, dsl

Potrebujem rozobrať malý „mini jazyk“, ktorý môžu používatelia zadávať na mojich stránkach. Zaujímalo by ma, aké sú náprotivky lex a jacc alebo antlr pre svet php.

odpovede:

6 pre odpoveď č. 1

použil som Generátor LIME Parser pre PHP pred pár rokmi a už to bolo zrelé a stabilné.

Samotný generátor syntaktického analyzátora je napísaný v PHP,na čom vlastne v nijakom technickom zmysle nezáleží - pretože vyžadujeme iba to, aby vygenerovaný analyzátor bol v PHP - ale napriek tomu sa mi tento detail páči. Cítim sa pri písaní softvéru v PHP menej ospravedlňujúci ;-)

EDIT:

Mal by som pridať:

  1. Tam, kde som napísal „použité“, by bolo presnejšie povedať, že som „hral s“. Zatiaľ som nenapísal žiadny produkčný kód pomocou vápna. Ale nevidím dôvod, aby som tak neurobil.

  2. „Príklad kalkulačky“ poskytovaný na použitie s vápnommetóda tokenize (), ktorá je veľmi vzdialená od skutočnej náhrady sily lexu. Ak však potrebujete skutočný tokenizer, malo by byť možné použiť lex na „prednom konci“ na napájanie tokenov na vápno na „zadnom konci“.


0 pre odpoveď č. 2

http://pear.php.net/package/PHP_ParserGenerator

http://wezfurlong.org/blog/2006/nov/parser-and-lexer-generators-for-php


0 pre odpoveď č. 3

Ja som preniesol Jison, Bisonov klon v JavaScripte,do php. Výsledkom je killer parser, ktorý je schopný spracovať veľmi jednoduchý a veľmi zložitý lexing / parsing. Teraz je súčasťou Jison, ale na mojej vidličke je niekoľko aktualizácií - https://github.com/robertleeplummerjr/jison . Súbory sa nachádzajú tu - https://github.com/robertleeplummerjr/jison/tree/master/ports/php

Ak si prečítate súbor readme na tejto stránke, súčasne vytvoríte syntaktický analyzátor javascript a php, ktorý bude schopný robiť rovnaké alebo rôzne veci. COOL!


-5 pre odpoveď č. 4

Radím vám, aby ste napísali svoj vlastný analyzátor, pretože dnes je to celkom ľahké.

Najjednoduchší spôsob, ako to urobiť, by bolo podľa môjho názoru vytvoriť jednu triedu pre každý možný typ syntaxe (výraz, test, slučka atď.).

V každej triede potom kódujte nasledujúce metódy:

  • jedna metóda na určenie z reťazca, ak je reťazec daného typu (a+b je typu „výraz“, if(b) nie je)
  • jedna metóda na „spustenie“ tohto typu (a+b vráti sa a->run() + b->run(), a a->run() vráti hodnotu)