2010-12-08 2 views
1

코딩 규칙 오류를 검사하는 python 스크립트가 있습니다. 이는 코딩 표준 위반을 나타내는 정규 표현식을 일치시킴으로써이를 수행합니다.부정적인 정규식에 대한 또 다른 질문

우리의 표준 중 하나는 'if', 'while'및 'do-while'조건문에 조건부 연산자가 포함되어야한다는 것입니다.

그래서 더

if (var1) 
{ 
    // blah 
} 

대신 내가 필요한, 예를 들어

if (var1 == TRUE) 
{ 
    // blah 
} 

필요가 없습니다에 대한 진술은 "만일"줄의 시작 부분에 일치 때 상황을 발견하는 경우 "==", "< =", "> =", "||"을 포함하지 않습니다. 그 뒤에는 "& &"이 표시됩니다. 나는 몇 시간 동안 내 머리를 벽에 두들겨 맞 혔고, 나는 누군가가 고통의 일부를 완화시킬 수 있기를 바라고있다.

+4

코딩 규칙을 포기하는 것이 좋습니다. 'var1 == TRUE'를 써야만하는 것은 정말로 절름발이입니다. –

+1

'if (var1 == True)'가 unidiomatic으로 간주되는 것을 알 수 있습니까? 나는 당신이 TRUE 상수를 사용하고 있다는 것을 알지만, 왜 True를 사용하지 않는가? 참조 : http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html#testing-for-truth-values ​​ –

+5

** 정규 표현식으로 프로그래밍 언어를 구문 분석하지 마십시오. ** 단순히 불가능합니다. 심지어 그것이 가능했다 할지라도 실제로는 너무 복잡한 10 억 배였습니다. Regexes는 복잡한 문법은 말할 것도없고 중첩 된 괄호를 구문 분석 할 수 없습니다. 쿼리 할 수있는 AST를 제공하는 파서를 작성해야합니다. 또한 다른 두 가지 주석을 참조하십시오. – delnan

답변

0

여기에 제가 한 일이 있습니다. 대부분 이상적이지는 않지만 잘 작동하며 제 3 자 파서를 조사하고 있습니다.

^\s*\bif\s*\(\s*\w+\s*\)\s*$ 
1

이것은 입력 한 내용으로 수행 할 수 있지만 주석에 언급 된대로 (예 : pyparsing) 파서를 사용하면 이 좋습니다.

>>> s 
'if (var1)' 
>>> s2 
'if (var1 == TRUE)' 
>>> if re.search(r"^if.+==|<=|>=|\|\||&&", s): print "found bad signs" 
... 
>>> if re.search(r"^if.+==|<=|>=|\|\||&&", s2): print "found bad signs" 
... 
found bad signs 
+0

C++ 파서를 작성하고 싶지는 않습니다. 당신은 정말로하지 않습니다. 간신히 하나 또는 두 개의 성숙한 프론트 엔드가 있고 (너무 까다 롭지 않은 코드로 작동하는 소수), 그들은 모두 사용하고자하는 것보다 개발에 더 많은 노력을 기울였습니다;) – delnan

+0

나는 ' 우리가 C++에 대해 말하고 있는지 확실하지 않습니다. 물론 다른 사람이 이미 만든 파서를 재사용하는 것이 훨씬 더 좋은 해결책입니다. 요점은 파서를 사용하는 것이이 경우 regexes를 사용하는 것보다 낫다는 것입니다. – aeter