Ya he escrito un generador que hace el truco, pero me gustaría saber la mejor manera posible de implementar la regla de fuera de juego.¿Cómo implementaría la regla de fuera de juego?
En pocas palabras: Off-side rule significa en este contexto que la indentación se reconoce como un elemento sintáctico.
Esta es la regla del fuera de juego en pseudocódigo para hacer que la captura tokenizers hendidura en forma utilizable, no quiero limitar respuestas por idioma:
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
Este Layouter no genera más de una nueva línea al tiempo, y no genera NEWLINE cuando hay una sangría por venir. Por lo tanto, las reglas de análisis siguen siendo bastante simples. Es bastante bueno, creo, pero informar si hay mejor manera de lograrlo.
Mientras uso esto por un tiempo, he notado que después de los DEDENTES puede ser bueno emitir newline de todos modos, de esta manera usted puede separar las expresiones con NEWLINE manteniendo el INDENT DEDENT como un avance de la expresión.
Su código no puede emitir DEDENTES múltiples, ni considera la degradación antes de EOF. Puede ser útil para algo, pero esas cosas son más importantes que el apoyo de paréntesis. – Cheery
Además, no se preocupe por el soporte especial para paréntesis, va a perder el mejor punto, al igual que Python. El objetivo del diseño es permitirle proporcionar una excelente sintaxis de varias líneas, no está en conflicto con el paréntesis, a menos que no pueda combinar esos dos. – Cheery
Mi código sí emite DEDENT múltiple, así que creo que está malinterpretando. Pero estoy de acuerdo en que me gustaría algo que se parezca más a Haskell que a Python, así que necesito un nuevo enfoque. – dkagedal