트릭을 수행하는 생성기를 이미 작성했지만 오프 쉐어 규칙을 구현하는 최선의 방법을 알고 싶습니다.오프사이드 규칙을 구현하는 방법에 대해 어떻게 생각하십니까?
잠깐 : 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
개 이상의 NEWLINE를 생성하지 않습니다이 layouter 시간이 들리고 들여 쓰기가있을 때 NEWLINE을 생성하지 않습니다. 따라서 구문 분석 규칙은 매우 간단합니다. 꽤 좋은 생각이지만, 더 좋은 방법이 있다면 알려주십시오.
잠시 사용하는 동안, 나는 DEDENTs 이후에 어쨌든 newline을 내보내는 것이 좋을 수 있음을 알았습니다.이 방법은 표제를위한 트레일러로 들여 쓰기를 유지하면서 NEWLINE으로 표현을 분리 할 수 있습니다.
코드가 여러 DEDENT를 방출 할 수 없으며 EOF 이전에 헌정을 고려하지도 않습니다. 유용 할 수 있지만, 괄호 지원보다 중요합니다. – Cheery
또한, 괄호에 대한 특별한 지원에 대해 신경 쓰지 마세요. 파이썬처럼 최선의 포인트를 놓치지 않을 것입니다. 레이아웃의 요점은 우수한 다중 행 구문을 제공 할 수 있도록 허용하는 것이며, 두 가지를 결합 할 수 없다면 괄호와 충돌하지 않습니다. – Cheery
내 코드가 여러 DEDENT를 방출하므로 사용자가 잘못 읽고 있다고 생각합니다. 그러나 나는 파이썬보다는 하스켈처럼 보이는 것을 선호한다. 그래서 새로운 접근이 필요하다. – dkagedal