2014-10-23 5 views
5

Ich erstelle einen Infix-Ausdrucksparser, also muss ich einen Tokenizer erstellen. Es funktioniert gut, bis auf eine Sache: Ich weiß jetzt nicht, wie man negative Zahlen vom "-" Operator unterscheidet.Wie man den '-' Operator von einer negativen Nummer für einen Tokenizer unterscheidet

Zum Beispiel, wenn ich habe:

23/-23 

Die Token 23 sein sollte, / und -23, aber wenn ich einen Ausdruck haben wie

23-22 

Dann sollten die Tokens 23 sein, - und 22.

Ich fand eine dreckige Umgehungslösung, die ist, wenn ich ein "-" gefolgt von einer Zahl, sehe ich das vorherige Zeichen und wenn dieses Zeichen eine Ziffer oder ein ') ist, behandle ich das "-" als Betreiber und keine Nummer. Abgesehen Art von hässlich aus ist, es funktioniert nicht für Ausdrücke wie

--56 

, wo es die folgenden Token bekommt: - und -56 wo es --56

Jeder Vorschlag bekommen sollte?

+3

Nun, die C-Grammatik hat keine negativen Integer-Konstanten, es ist alles unäre Minus. Scheint so, als wäre das der einfachere Ansatz. –

+2

Das wäre normalerweise nicht die Aufgabe eines Tokenizers, Sie müssen das auf der Syntaxebene herausfinden. – nos

Antwort

8

Im ersten Beispiel sollten die Tokens 23, /, - und 23 sein.

Die Lösung besteht dann darin, die Token nach den Regeln der Assoziativität und Vorrangigkeit zu bewerten. - kann nicht an / binden, aber es kann zum Beispiel 23.

Wenn Sie --56 begegnen, ist - aufgeteilt in, -, 56 und die Regeln kümmern sich um das Problem. Besondere Fälle sind nicht erforderlich.

+2

@ 2501: ein Spezialfall, um den Sie sich sorgen müssen, ist die Konstante '- (MAXINT + 1)', die in 2s Komplement-Architekturen MININT ist, aber eine Konstante enthält, die für eine positive ganze Zahl zu groß ist. Das bedeutet, dass der Parser und nicht der Lexer für die Fehlerprüfung verantwortlich sein muss, die als Teil der Konstantenfaltung ausgeführt werden muss, um Out-of-Bound-Ganzzahlliterale richtig zu kennzeichnen. – rici

Verwandte Themen