5

tworzę drzewo składniowy, który będzie zawierał wyrażenia podobne doJednoargumentowy i binarne Minus w Parse Drzewa

3 - 4 * 8

lub

8 * -5

lub

-(10 * 1)

Potrzebuję sposobu, aby odróżnić jednoargumentowy i dwójkowy minus. Sposób, w jaki moja gramatyka idzie teraz do binarnego minusu, jest osiągany najpierw, ale myślę o zmianie tego i dodaniu zmiennej flagi, która zawiera ostatnią zmienną.

Ex: jeśli jest 5 - 6

Flaga trzyma 5 i jeśli uzna to za minus, a flaga jest liczba, tym pominąć jednoskładnikowa i przejdź do pliku binarnego.

Jednak nie jestem pewien dokładnie, jak zaimplementować to w C++

Każda pomoc będzie mile widziana.

Dzięki

+1

masz na myśli sposób, aby odróżnić je jako robisz analizowania, czy sposób, aby odróżnić je w parse drzewo? W drzewie analizy jest to banalne - wystarczy mieć oddzielne operatory 'UNARY_MINUS' i' BINARY_MINUS'. Jeśli masz na myśli, że parsujesz, jednoargumentowy minus pojawia się, gdy oczekujesz operandu, a nie operatora. –

+0

W moim parserze chciałbym rozróżnić między -5 a 4 -5. Moja następna część zamienia liście tego drzewa na drzewo AST (które działa), ale mój parser widzi wszystko jako binarny minus (4 - 5). – Dfranc3373

Odpowiedz

6

Najprostszym sposobem wdrożenia parser jest metodą Recursive Descent. Upewnij się, aby dać binarnego minus wyższy priorytet niż jednoargumentowy minus, podobnie jak w wymienionej stronie:

E --> | E "+" E 
     | E "-" E 
     | "-" E 
     | E "*" E 
     | E "/" E 
     | E "^" E 
     | "(" E ")" 
     | v 
+0

Po obejrzeniu strony, mogę ponownie napisać moje zasady gramatyczne, aby postępować zgodnie z zasadami na stronie, ale jednym z problemów jest to, że ten parser musi również być w stanie obsłużyć =, < , <=, >,> = i, lub, nie – Dfranc3373

+0

@ Dfranc3373 zobacz http://en.cppreference.com/w/cpp/language/operator_precedence dla pełnego pierwszeństwa operatora dla C++ – TemplateRex

+0

Dziękuję bardzo! – Dfranc3373