J'ai déjà écrit un générateur qui fait l'affaire, mais j'aimerais connaître la meilleure façon d'implémenter la règle du hors-jeu.Comment allez-vous mettre en œuvre la règle hors-jeu?
En résumé: Off-side rule signifie dans ce contexte que l'indentation est reconnue comme un élément syntaxique.
est ici la règle hors-jeu dans pseudocode pour faire tokenizers que indentation de capture sous une forme utilisable, je ne veux pas limiter les réponses par langue:
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
Ce maquettiste ne génère pas plus d'un saut de ligne à temps, et ne génère pas NEWLINE quand il y a indentation à venir. Par conséquent, les règles d'analyse restent assez simples. C'est plutôt bien, je pense, mais informez s'il y a une meilleure façon de l'accomplir. En utilisant ceci depuis un moment, j'ai remarqué qu'après DEDENTs, il peut être sympa d'émettre une nouvelle ligne de toute façon, de cette façon vous pouvez séparer les expressions avec NEWLINE tout en gardant INDENT DEDENT comme bande-annonce pour l'expression.
Votre code n'est pas capable d'émettre plusieurs DEDENT, ni considéré comme dépendant avant EOF. Cela peut être utile pour quelque chose, mais ces choses sont plus importantes que le support des parenthèses. – Cheery
Aussi, ne vous souciez pas d'un support spécial pour les parenthèses, vous allez manquer le meilleur point, tout comme python. Le point de la mise en page est de vous permettre de fournir une excellente syntaxe multi-lignes, il n'est pas en conflit avec les parenthèses, sauf si vous n'êtes pas en mesure de combiner ces deux. – Cheery
Mon code émet plusieurs DEDENT, donc je pense que vous le lisez mal. Mais je suis d'accord que je voudrais quelque chose qui ressemble plus à Haskell qu'à Python, j'ai donc besoin d'une nouvelle approche. – dkagedal