Próbuję napisać mały analizator składni z Irony. Niestety dostaję "konflikt redukujący zmiany". Gramatyki nie są moją mocną stroną i muszę tylko wykonać tę jedną małą rzecz. Oto zmniejszona gramatyka, która produkuje błąd:Problem rozwiązujący konflikt zmniejszający zmianę w mojej gramatyce
ExpressionTerm := "asd"
LogicalExpression :=
ExpressionTerm |
LogicalExpression "AND" LogicalExpression |
LogicalExpression "OR" LogicalExpression
Co robi „shift zmniejszyć konflikt” oznacza i jak mogę go rozwiązać? Rozumiem, że to oznacza, że moja gramatyka jest niejednoznaczna, ale nie mogę wykręcić logiki w wystarczającym stopniu, aby zobaczyć, jak.
Dodano: Aby wyjaśnić - "asd" to po prostu ciąg literalny "asd". Tak bym się spodziewał, że następujące wyrażenia są przetwarzane przez tę gramatykę:
asd
asd AND asd
asd AND asd OR asd
asd OR asd AND asd OR asd
Dodany 2: Zapomniałem powiedzieć, korzeń gramatyki jest LogicalExpression
.
Dodano 3: Ahh, mam! Niejednoznaczność ponieważ jest wyrazem jak
asd AND asd OR asd
można interpretować na dwa różne sposoby:
(asd AND asd) OR asd
asd AND (asd OR asd)
Ale jak mogę rozwiązać ten problem? OK, mogę ustawić jedno z AND i OR, aby były silniejsze niż inne (i tak postanowiłem). Ale teraz widzę, że błąd pojawia się, nawet jeśli jest tylko jeden operator. Innymi słowy, ta produkuje również ten sam błąd:
LogicalExpression := "asd" | LogicalExpression "OR" LogicalExpression
w tym przypadku chcę to:
asd OR asd OR asd
być przetwarzane do tego:
(asd OR asd) OR asd
Jaki jest nie- niejednoznaczny sposób robienia tego?
Dodano 4: Gotowy!
LogicalExpression1 := LogicalExpression1 "OR" LogicalExpression2 | LogicalExpression2
LogicalExpression2 := LogicalExpression2 "AND" LogicalExpression3 | LogicalExpression3
LogicalExpression3 := "NOT" LogicalExpression4 | LogicalExpression4
LogicalExpression4 := "asd" | "(" LogicalExpression1 ")"
Analizuje wszystkie wyrażenia logiczne, z operatorem jako NIE-> ORAZ-> LUB. "asd" można zastąpić wyrażeniem przeznaczonym dla twoich warunków.
Heh, jeśli pomyśleć o tym, ja zaczynam o tym pamiętać wzór z moich dni na Uniwersytecie. : D –