Ich habe bereits einen Generator geschrieben, der den Trick macht, aber ich würde gerne den bestmöglichen Weg kennen, die Offside-Regel zu implementieren.Wie würden Sie die Offside-Regel implementieren?
Kurz: Off-side rule bedeutet in diesem Zusammenhang, dass Einbuchtung als syntaktisches Element erkannt zu werden.
Hier ist die Abseitsregel in Pseudo-Code für Tokenizer zu machen, dass in verwertbarer Form capture Vertiefung, ich möchte nach Sprache keine Antworten beschränken:
token NEWLINE
matches r"\n\ *"
increase line count
pick up and store the indentation level
remember to also record the current level of parenthesis
procedure layout tokens
level = stack of indentation levels
push 0 to level
last_newline = none
per each token
if it is NEWLINE put it to last_newline and get next token
if last_newline contains something
extract new_level and parenthesis_count from last_newline
- if newline was inside parentheses, do nothing
- if new_level > level.top
push new_level to level
emit last_newline as INDENT token and clear last_newline
- if new_level == level.top
emit last_newline and clear last_newline
- otherwise
while new_level < level.top
pop from level
if new_level > level.top
freak out, indentation is broken.
emit last_newline as DEDENT token
clear last_newline
emit token
while level.top != 0
emit token as DEDENT token
pop from level
comments are ignored before they are getting into the layouter
layouter lies between a lexer and a parser
Diese Layouter bei nicht mehr als ein NEWLINE erzeugen Zeit und erzeugt NEWLINE nicht, wenn ein Einzug entsteht. Daher bleiben Parsing-Regeln recht einfach. Es ist ziemlich gut, denke ich, aber informiere, wenn es einen besseren Weg gibt, es zu erreichen.
Während der Verwendung für eine Weile, habe ich bemerkt, dass es nach DEDENTs nett sein kann, Newline trotzdem auszugeben, auf diese Weise können Sie die Ausdrücke mit NEWLINE trennen, während Sie den INDENT DEDENT als Anhänger für Ausdruck behalten.
Ihr Code ist nicht in der Lage, mehrere DEDENTs auszugeben. Es kann für etwas nützlich sein, aber diese Dinge sind wichtiger als Klammer-Unterstützung. – Cheery
Auch, kümmern Sie sich nicht um spezielle Unterstützung für Klammern, Sie werden nur den besten Punkt verpassen, genau wie Python. Der Zweck des Layouts besteht darin, Ihnen eine ausgezeichnete mehrzeilige Syntax zu bieten. Es besteht kein Konflikt mit Klammern, es sei denn, Sie können diese beiden nicht kombinieren. – Cheery
Mein Code gibt mehrere DEDENT aus, also denke ich, dass Sie ihn falsch lesen. Aber ich stimme zu, dass ich etwas mögen würde, das mehr wie Haskell eher als Python aussieht, also brauche ich einen neuen Ansatz. – dkagedal