Я уже написал генератор, который делает трюк, но я хотел бы знать наилучший способ реализации правила вне игры.Как вы могли бы реализовать вне-правила?
Вкратце: Off-side rule означает в этом контексте, что отступ становится признанным синтаксическим элементом.
Вот офсайд правил в псевдокоде для создания tokenizers, что захват отступы в удобной форме, я не хочу, чтобы ограничить ответы по языку:
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
Это Layouter не создает более одного NEWLINE в время и не генерирует NEWLINE, когда появляется отступы. Поэтому правила синтаксического анализа остаются довольно простыми. Это довольно хорошо, я думаю, но сообщите, есть ли лучший способ сделать это.
При использовании этого в течение некоторого времени я заметил, что после DEDENTs может быть приятно выпустить новую строку в любом случае, таким образом вы можете отделить выражения с NEWLINE, сохраняя INDENT DEDENT в качестве трейлера для выражения.
Ваш код не может испускать несколько DEDENT, и он не считает разделителем до EOF. Это может быть полезно для чего-то, но эти вещи важнее, чем поддержка круглых скобок. – Cheery 2009-06-04 09:31:51