Expressão:
(x AND ( Y OR (K AND Z))) -> (A AND (B OR C))
Vamos identificar os elementos que me interessam.Expressão com nodos identificados:
(x[1] AND[2] ( Y[3] OR[4] (K[5] AND[6] Z[7]))) -> (A[8] AND[9] (B[10] OR[11] C[12]))
Nesta expressão eu faço distinção entre “átomos lógicos” e “conectivos lógicos”. Por exemplo, o elemento 1 é um “átomo lógico” e o elementos 2 é um “conectivo lógico”.
Eu queria fazer um parsing de expressões deste tipo e montar um grafo explícito com ela. Eu já tenho toda a estrutura do grafo pronta. Consigo inclusive elaborar (à mão!) uma expressão como esta no grafo e manipular estas informações. No entanto, eu queria oferecer uma entrada usando esta linguagem e, fazer um parsing para criar meu grafo.
Até sei fazer o parsing das expressões codificadas nesta linguagem, mas não consegui pensar em uma maneira inteligente de ir montando o grafo à medida que faço o parsing. Para entender o que quero fazer, vamos supor uma expressão menor:
(x[1] AND[2] (y[3] OR[4] z[5]))
Lembrando que os números entre colchetes só estão aí para identificarmos os elementos que interessam. A saída seria um grafo de 5 nodos, onde:
2(AND) é pai de 1 e 4
4[OR] é pai de 3 e 5
É importante notar que os nodos “átomso lógicos” são sempre terminais.
Alguém tem alguma ideia de como posso ir gerando esta estrutura à medida que faço o parsing?
Agradeço desde já.