2011-03-06 3 views
2

저는 컴파일러 생성 클래스를위한 파이썬 문법 (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 

다른 규칙의 대부분이 제대로 작동한다고 가정하면 정규 표현식이 위의 규칙에서 문제라고 믿게되지만이 규칙이 대부분의 시간에 실패하는 이유는 알 수 없습니다. 누구든지 어떤 통찰력을 가지고 있습니까?

+0

"regex"태그가 지정되어야하지만 5 개의 태그 만 허용됩니다. 이 질문은 파이썬 언어와 주변 적으로 만 관련이 있으므로 아마도 태그를 대체해야합니까? – Vamana

+2

저는 flex를 모르지만 작동 한 각 샘플은 단일 문자이며 작동하지 않는 각각의 샘플은 그렇지 않습니다. 플렉스는 단일 문자 대신 전체 토큰과 일치하는 것일까? 문자 클래스 뒤에'+'를 추가해보십시오. – Vamana

+0

@ Vamana +1! 대답으로 두 번째 메모를 제출하고 녹색 확인을 받으십시오! 분명히 정확히 무슨 일이 일어 났는가? 나에게 전체 토큰을 매치 할 필요가 없다고 생각조차하지 않았다. 감사! – chaosTechnician

답변

3

나는 flex를 모르지만 작동 한 각 샘플은 하나의 문자이며 작동하지 않는 각각의 샘플은 단일 문자라는 것을 알았습니다. 플렉스는 단일 문자 대신 전체 토큰과 일치하는 것일까? 문자 클래스 뒤에 +을 추가해보십시오.

관련 문제