Parser-Beispiel für römische Zahlen

  • Der Versuch, Boost Spirit und das in den Dokumenten angegebene Beispiel zu lernen, hat mich etwas verwirrt.

    In Bezug auf diesen Code:

    <

    http: / /www.boost.org/doc/libs/1_46_1/libs/spirit/example/qi/roman.cpp

    Insbesondere dieses Segment der Grammatik:

             start = eps             [_val = 0] >>
                (
                    +lit('M')       [_val += 1000]
                    ||  hundreds    [_val += _1]
                    ||  tens        [_val += _1]
                    ||  ones        [_val += _1]
                )
     

    Könnte mir jemand erklären, warum es + leuchtet ('M') und nicht * leuchtet ('M') . Denn kann es nicht null oder mehr M gegenüber einem oder mehreren M geben?

    24 August 2011
    Integer
4 answers
  • Der Operator a || b bedeutet a oder b, aber b nach a, wenn a auftritt. Bei der Messung des Operators ist der Fall, dass es kein M gibt, implizit (da die Übereinstimmung für M möglicherweise vorhanden ist oder nicht). Würden Sie im Fall von *lit('M') auch sagen, dass die erste Regel passt, wenn NO M ist? Es wäre trotzdem gültig und _val würde um 1000 erhöht.

    24 August 2011
    Diego Sevilla
  • Sowohl +lit('M') als auch *lit('M') sind korrekt. Der erste ist jedoch (semantisch) lesbarer als der zweite, meiner Meinung nach, addieren 1000 zu _val, wenn one übereinstimmt, und wiederholt es. Auf der anderen Seite ist das Letztere schwer lesbar, da man es als add 1000 zu _val lesen könnte, selbst wenn die Null-Übereinstimmung falsch ist. 1000 wird nicht zu _val für ein Zero-Time-Match hinzugefügt, der Parser *lit('M') scheint jedoch auch für Zero-Match zu passen (scheint verwirrend zu sein).

    Also ist +lit('M') vorzuziehen.


    Alles klar. Ich habe deinen Kommentar gelesen. CCLLIX ist keine gültige römische Zahl. Was ist Ihrer Meinung nach der Wert? 309? Wenn dies der Fall ist, welcher Wert wäre dann für CCCIX? Es ist zu 309 und es ist richtig. Dein ist falsch. Daher stoppt der Parser, wenn Sie *lit('M') verwenden. Beachten Sie auch, dass der Parser auch dann angehalten wird, wenn Sie für diese falsche Eingabe +lit('M') verwenden.

    24 August 2011
    Nawaz
  • Es ist (eine oder mehrere Frauen) ODER Hunderte ODER Zehn ODER ODER. (Null oder mehr Ms) ODER Hunderte ODER Zehner ODER -Eine würde mit keiner Ms oder der leeren Zeichenfolge übereinstimmen und sinnlos 1000 hinzufügen.

    24 August 2011
    Logan Capaldo
  • Wenn Sie den Ausdruck A || B in Qi abgleichen, bedeutet dies entweder nur A oder nur B oder A followed by B. Daher bedeutet +lit('M') || hundreds in Ihrem Fall +lit('M') oder hundreds oder +lit('M')followed by hundreds. Aus diesem Grund erlaubt es die Grammatik, beliebige römische Zahlen zu finden, die nicht einmal mit M beginnen.

    26 August 2011
    hkaiser