2013-06-22 2 views
0

커맨드 라인 파서를 만들고 옵션 번들링을 지원하고 싶습니다. 그러나 발생할 수있는 모호성 및 충돌을 처리하는 방법을 잘 모르겠습니다. 다음 세 가지 경우를 고려번들 된 명령 줄 옵션을 모호하게 구문 분석하는 방법은 무엇입니까?

1.

-I accepts a string 

"-Iinclude" -> Would be parsed as "-I include" 

2.

-I accepts a string 
-n accepts an integer 

"-Iincluden10" -> Would be parsed as "-I include -n 10" because the 'cluden10' after the first occurrence of 'n' cannot be parsed as an integer. 

3.

-I accepts a string 
-n accepts an integer 
-c accepts a string 

"-Iin10clude" -> ??? What now ??? 

어떻게 마지막 문자열을 처리하나요? 여러 가지 구문 분석 방법이 있으므로 사용자에게 모호성에 대해 알리는 오류가 발생합니까? 아니면 "-I i -n 10 -c lude"와 같이 가장 많이 생성되는 문자열을 파싱할지 결정해야합니까?

온라인에서 자세한 규칙을 찾을 수는 없지만 개인적으로는 모호한 오류로 표시합니다.

답변

2

필자가 아는 한 명령 행 매개 변수 구문 분석에는 표준이 없으며 플랫폼 간 합의도 없습니다. 따라서 우리가 할 수있는 최선의 방법은 상식에 호소하는 것이며 principle of least astonishment입니다.

Posix 표준은 명령 줄 매개 변수를 구문 분석하기 위해 일부 guidelines을 제안합니다. 그들은 단지 지침 일뿐입니다. 연결된 섹션에서 알 수 있듯이 일부 표준 셸 유틸리티는 적합하지 않습니다. 그리고 Gnu 유틸리티는 Posix 가이드 라인을 준수 할 것으로 예상되지만, 일반적으로 "긴"매개 변수의 사용을 포함하여 일부 측면에서 벗어납니다. 에서 POSIX 그룹에 대해 말하는 어떤 경우

이며, 하나의 뒤에 그룹화 할 때 옵션 - 인자를 최대 한 다음, 옵션 옵션 - 인수없이

하나 이상의 옵션이 수락해야 '-'구분 기호.

Posix 옵션은 모두 단일 문자 옵션입니다. 옵션 그룹의 마지막 옵션 만이 인수를 허용 할 수있는 옵션이 될 수 있다는 가이드 라인이 명확하다는 점에 유의하십시오.

Gnu 스타일의 긴 옵션에 대해서는 getopt_long 유틸리티의 동작 이외의 다른 표준에 대해서는 알지 못합니다. 이 유틸리티는 위에서 언급 한 그룹화 된 옵션 구문을 포함하여 단일 문자 옵션에 대해 Posix 스타일을 구현합니다. 인수를 취하는 단일 문자 옵션을 인수 바로 뒤에 올리거나 인수를 다음 단어로 사용하는 (경우에 따라 단일 한) 옵션 그룹의 끝에있을 수 있습니다.

긴 옵션의 경우 옵션에서 인수를 허용하는지 여부에 관계없이 그룹화 할 수 없습니다. 옵션이 인수를 허용하면 두 가지 스타일이 허용됩니다. 즉, 옵션 바로 다음에 =이오고 그 다음 인수가 오거나 인수가 다음 단어입니다.

Gnu 스타일에서는 긴 옵션을 두 개의 대시 (--)로 지정해야하기 때문에 긴 옵션을 단일 문자 옵션과 혼동 할 수 없습니다.

대조적으로 많은 TCL/Tk 기반 유틸리티 (및 일부 다른 명령 줄 파서)는 단일 옵션 -과 함께 긴 옵션을 허용하지만 옵션 그룹을 허용하지 않습니다.

이 모든 스타일에서 옵션은 두 개의 분리 된 세트로 나뉩니다. 인수는 인수를 취하고 인수는 취하지 않습니다.

제안하는 것처럼 자연스럽게 혼합 된 스타일은 있지만 애매합니다. 공식적인 모호성 규칙을 사용하더라도 모호성은 위험합니다. 특히 콘솔 응용 프로그램에서 명령 줄을 되돌릴 수없는 경우가 있습니다. 또한 상황에 따른 모호성 제거는 스크립트에서 예측하기 힘든 오류의 원인이 될 수있는 사용 가능한 옵션 세트가 나중에 확장되는 경우 (심지어 자동으로) 의미를 변경할 수 있습니다.

따라서 Gnu와 같은 간단한 기존 연습을 따르는 것이 좋으며, 부적합한 명령 행을 잘못 해석하지 않도록하는 것이 좋습니다.

+0

흥미로운 통찰력과 추천에 대해 감사드립니다. POSIX/Gnu 지침을 좀 더 조사한 다음 언급 한 간단한 기존 관행 중 하나를 결정하려고 노력할 것입니다. – NordCoder

관련 문제