저는 컴파일러 생성 클래스를위한 파이썬 문법 (Flex로 작성)을위한 렉서 (lexer) 작업을하고 있습니다. 들여 쓰기 블록의 끝을 설명하기 위해 줄의 시작 부분에 공백이 없을 때 잡을 수있는 정규 표현식 작업.라인 시작 부분에 공백이 없다는 것을 알아챌 Regex (flex)
주석, 공백 행 및 들여 쓰기를 확인한 후에 들여 쓰기가없는 규칙 검사가 나타납니다. 규칙을 점검하기 전에 다른 것을 검사하기도합니다. 여기가 바로 지금의 모습입니다 :
<INITIAL>^[^ \t] {
printf("DEBUG: Expression ^[^ \\t] matches string: %s\n", yytext);
/* Dedent to 0 if not mid-expression */
if(!lineJoin && bracketDepth() == 0)
changeIndent(0);
/* Treat line as normal */
REJECT;
}
내가 알고있는 것처럼, 위의 규칙해야 출력이 실제 파이썬 코드를 가지고 있지만 들여 쓰기로 시작하지 않는 lexed 파일의 모든 라인에 대한 디버그 라인. 그러나, 지금 서 있기 때문에, 많은 텍스트의 경우에는 몇 줄 밖에 표시되지 않습니다. 예를 들어
는 디버그 출력데도이 테스트 케이스 나타나지 (또한 전체적으로 라인 (4)에 dedent를 그리워)
myList = [1,2,3,4]
for index in range(len(myList)):
myList[index] += 1
print(myList)
을하지만에서 라인마다 표시이 하나
a = 1 + 1
b = 2 % 3
c = 1^1
d = 1 - 1
f = 1 * 1
g = 1/1
다른 규칙의 대부분이 제대로 작동한다고 가정하면 정규 표현식이 위의 규칙에서 문제라고 믿게되지만이 규칙이 대부분의 시간에 실패하는 이유는 알 수 없습니다. 누구든지 어떤 통찰력을 가지고 있습니까?
"regex"태그가 지정되어야하지만 5 개의 태그 만 허용됩니다. 이 질문은 파이썬 언어와 주변 적으로 만 관련이 있으므로 아마도 태그를 대체해야합니까? – Vamana
저는 flex를 모르지만 작동 한 각 샘플은 단일 문자이며 작동하지 않는 각각의 샘플은 그렇지 않습니다. 플렉스는 단일 문자 대신 전체 토큰과 일치하는 것일까? 문자 클래스 뒤에'+'를 추가해보십시오. – Vamana
@ Vamana +1! 대답으로 두 번째 메모를 제출하고 녹색 확인을 받으십시오! 분명히 정확히 무슨 일이 일어 났는가? 나에게 전체 토큰을 매치 할 필요가 없다고 생각조차하지 않았다. 감사! – chaosTechnician