2013-07-29 39 views
6

Nie mam tła kompilatora, więc nie jestem pewien, czy jest to coś commmon w tym obszarze. Czy istnieją standardowe metody analizowania wyrażeń takich jak ten? (Say, zakładka wskazuje głębokość)Jak analizować tego typu wyrażeń?

And 
    A + B = 1 
    C + D = 1 
    Or 
     P + Q = 1 
     K = 1 
    And 
     Q = 1 
     R = 2 

powinien być analizowany jako:

((A+B=1) AND (C+D=1) AND ((P+Q=1) OR (K=1)) AND ((Q=1) AND (R=2))) 

Nie jestem pewien, czy należy odwołać się do oceny opartej stosu? Obecnie próbuję jednego z nich i opublikuję działający kod, jeśli uda mi się go uruchomić.

Wszelkie sugestie na prosty sposób, aby to osiągnąć?

+0

Jaki jest kontekst? Czy musi być "bezpieczny"? A może mógłbyś nieco zmienić swoją składnię i użyć Pythona z 'eval()' lub podobnym? Na przykład '((A + B == 1) i (C + D == 1))' jest składnią Pythona. –

+0

Niestety, nie mogę zmienić wejścia. Parsuję niektóre pliki XML i udało mi się przetworzyć wyrażenia w łańcuchu. Jak sformatować ciąg jest do mnie, ale kolejność oceny i wszystko nadal wymaga opieki.Ponadto nie chcę niczego oceniać, ale chcę powiedzieć, aby uzyskać ciąg do drukowania. – Legend

+0

Czy przetwarzasz wyrażenie na drzewa? Następnie oceniając je, podając w liczbach te zmienne? – Adrian

Odpowiedz

3

Zakładając, że pytasz o sposób analizowania wyrażeń zbudowanych z operatorów o różnych priorytetach i skojarzeniach - absolutnie.

Jedno skuteczne podejście nazywa się "pierwszeństwem operatorów od góry", a być może także "priorytetem operatorów" i "wznoszeniem pierwszeństwa". Oto kilka ciekawych źródeł wyjaśniające podejście w szczegółach:

Naprawdę fajną rzeczą jest to, jak mało kodu to zajmuje.

Kluczowe pojęcia to:

  • prefiks vs wrostkiem vs mixfix

  • pierwszeństwo: jest 3 + 4 * 5 analizowany jako (3 + 4) * 5 lub 3 + (4 * 5)?

  • asocjatywność: czy x - y - z jest analizowany jako x - (y - z) lub (x - y) - z?

Przypadkowo, właśnie uczą się tych rzeczy niedawno i skończyło się pisząc artykuł na moim blogu o podobnym podejściu do analizowania operatora, który można znaleźć here. W moim podejściu zajmuję się operatorami infiksów, prefixów, postfiksów i mixfixów (to jest ? :); priorytety i asocjacje są określone w tabelach; Używam stosu do śledzenia operatorów, których operandy nie zostały jeszcze znalezione. Następnie analizator składni tworzy drzewo składniowe, w którym każdy węzeł jest podwyrażeniem.

+0

+1 Dziękuję za linki, przeglądam je teraz. – Legend