2013-05-29 3 views
5

Ich mache einen grundlegenden lexikalischen Analysator in Java für mein Semester Projekt und ich bin auf Konflikt auf einem Konzept mit meinem Fachlehrer.Ist die Zeichenfolge "1a" ein Fehler für den lexikalischen Analysator oder nicht?

Meine Ansicht ist, in der Regel, dass, wenn eine Eingabe wie „1a“ zu Lexer gegeben wird, dann sollte es Ausgang geben wie:

"<Number><Identifier>"

Aber mein Lehrer sagt, dass es sollte Fahne dies als Fehler, weil es, anstatt es als Zahl und Bezeichner zu behandeln, die ganze Zeichenfolge (zB "1a") als Fehler kennzeichnen sollte. Dies liegt daran, dass (wie er sagt) Bezeichner nicht mit einer Zahl beginnen können.

Im Gegenteil, ich denke, das sollte in der Verantwortung der nächsten Stufe des Compilers (Syntaxanalysator) sein, um zu entscheiden, ob etwas eine gültige Kennung ist oder nicht. Ich weiß, dass er recht hat mit Bezeichnern, die nicht mit einer Zahl beginnen, aber ich brauche einen Teil davon, dass der lexikalische Analysator derjenige sein sollte, der das entscheidet.

Ich werde Ihre Hilfe wirklich zu schätzen wissen. Danke

Antwort

3

Ein lexikalischer Analysator sollte sich damit befassen, welche Arten von Token legal sind oder nicht und den Text in Tokens teilen. Es wird fehlgeschlagen, wenn eine Zeichenfolge kein gültiges Token bilden kann.

Der Syntaxanalysator behandelt nur die Struktur des Programms, nachdem die Token bestimmt wurden. Es wird ein Fehler ausgegeben, wenn die Token nicht gemäß der gegebenen Grammatik analysiert werden können.

So ist Ihr Lehrer richtig. Die Bestimmung, ob eine Kennung legal ist, fällt unter die lexikalische Analyse.

+0

Warum kann der lexikalische Analysator '1' nicht lesen und bleibt dann bei 'a' als Zahl '1' stehen, beginnt von vorne und liest 'a' und markiert ihn als Kennung. Ist das nicht ein Trennzeichen für die NFA, die sich mit Zahlen beschäftigt? – Cheeta

+0

Ich würde sagen, die Tokenisierung geschieht mit vordefinierten Trennzeichen, normalerweise mit Leerzeichen. Damit der lexikalische Analysator die Zeichenfolge in 1 und a aufteilt, müssten wir zusätzliche Regeln dafür definieren. Ich denke, was Ihr Lehrer im Sinn hat, ist, dass 1a ein Token ist und da es keinen regulären Ausdruck für einen Bezeichner findet, gibt der lexikalische Analysator einen Fehler aus. –

+0

Hängt davon ab, wie der lexikalische Analysator geschrieben wird. Durch die Verwendung von flex ist es sehr einfach, einen lexikalischen Analysator zu erzeugen, der 1a als Zahl analysiert, gefolgt von einem Identifikator. – Eelke

-1

ich nicht Eingang auf den philosphy-of-Lexikons Fragen geben kann, aber ich kann für eine Antwort geben, wie Sie Ihr Projekt Code sollte:

-Code als er, wenn Sie schlägt vor, ein A. erhalten möchten

+0

Ich würde argumentieren, dass es gut ist zu streiten, auch wenn Sie falsch liegen oder Ihre Meinung nicht den Projektspezifikationen entspricht. Wie können wir sonst noch lernen? Downvoted, weil dies eine wirklich unnötige Antwort ist, und sollte ein Kommentar sein, wenn überhaupt gesagt. –

0

Der Grund dafür ist, dass Sprachen oft Postfixes auf Zahlen verwenden, wie 1L in C ist der Wert 1 des Typs long anstelle des Standardtyps int. Außerdem möchten Sie Postfixe später in einer Sprache hinzufügen können. Betrachten Sie Ihre 1a. Zuerst würde dies als int Wert 1 gefolgt von einem Bezeichner a geparst werden. Aber jetzt entscheidet sich der Ersteller des Compilers, ein Postfix für Zahlen zu verwenden. Plötzlich wird 1a zu einem einzigen Token.

Für 1a gibt es auch einen speziellen Fall, der besagt, dass 1a als Hexadezimalzahl gemeint sein könnte, aber Sie vergessen haben, das erforderliche Postfix/Präfix 0x1a für C oder 1ah für bestimmte Assemblerversionen anzulegen.

0

Das Erkennen im Parser würde nur für Grammatiken funktionieren, bei denen eine Zahl gefolgt von einem Bezeichner syntaktisch ungültig ist. Wenn 1 a gültige Syntax in Ihrer Sprache wäre, hätten Sie , um dies im Lexer zu behandeln, da der Parser nicht zwischen 1a (kein Leerzeichen) und 1 a (mit Leerzeichen) unterscheiden kann.

Warum nicht tun dies im Lexer? Die Aufgabe des Lexers ist es, die Arbeit des Parsers zu erleichtern. Jede mögliche Arbeit, die es tun kann, um Ihren Parser zu vereinfachen, ohne dem Lexer eine Menge Komplexität hinzuzufügen, ist eine gute Idee.

Verwandte Themen