2016-02-24 1 views

Répondre

2

La façon dont je l'ai fait était d'ajouter trois nouveaux opérateurs: "?"

  • ternaire ouvert si
  • ":" ternaire-else
  • si ternaire fermées

    Seuls les deux premiers seront créés directement lors de la lecture de l'expression initiale.
    Cependant, seul le troisième existera dans la sortie (le RPN de l'expression initiale).
    Le ternaire-ouvert-si est mis sur la pile des opérateurs chaque fois qu'un "?" est vu.
    Le ternaire-else n'est jamais mis sur la pile. Plutôt, la pile est poped jusqu'à ce qu'un ternary-open-if soit trouvé, alors le ternary-open-if est remplacé par le ternary-closed-if (indiquant ainsi que nous sommes dans la partie else de l'opérateur conditionnel).
    Les trois opérateurs ont une priorité plus élevée que tous les autres opérateurs (plus élevés, ils sont évalués après les autres opérateurs).
    Les opérateurs ternaire-if ont la même précédence et associativité droite (comme en C), ce qui signifie qu'un ternaire-si ne provoquera jamais un pop d'un autre ternaire-if.
    Le ternaire-else a une précédence plus élevée que le ternary-ifs, et son associativité est sans importance (puisqu'il n'est jamais mis sur la pile). Ainsi, lorsque vous rencontrez un ternaire-ouvert-si elle le convertira en un ternaire fermé comme mentionné précédemment.
    Lorsque vous rencontrez un ternaire-fermé-si elle va le faire éclater.

    exemples (ternaire, si fermé notées comme "?"):

    • "a b: c?" ->
      "abc:"
    • « a b? x y: z » ->
      "ABXYZ?????::"
    • "a x y: z: b" ->
      "axyz: b:"
    ?

    Cette méthamphétamine od est plus difficile à expliquer qu'à implémenter, et il apporte un léger changement à l'algorithme, donc si quelqu'un a une solution plus simple, merci de la poster.