2016-07-01 9 views
0

C++에서 콘솔 응용 프로그램을 작성 중이므로 응용 프로그램에서 옵션을 구성하기 위해 사용자 쉘과 같은 명령 시스템을 얻어야합니다. 예를 들어, 사용자가이 같은 작성할 수C++에서 명령 트리를 구문 분석하는 방법은 무엇입니까?

레지스터이름

연결개방[텔넷을 | SSH]

연결 스위치텔넷

보내텍스트

연결 스위치SSH

--register 
| 
--connetion 
|   |--open 
|   |--switch 
| 
--send 
:

는이


그래서, 분명 우리는 몇 가지 명령 트리가, 위의 예에서 우리가 등등텍스트

...와 ... 보내

각 명령은 다른 양의 매개 변수를 가질 수 있습니다.


질문 :

  • 어떻게 같은 명령 트리를 구문 분석?

이제 정규식으로 구문을 분석하지만이 솔루션은 실제로보기 흉합니다. 저는 YACC와 LEX에 관해 읽었습니다. 그러나 이것을 사용하는 것이 정말 좋은 생각인지 확신 할 수 없습니다.

구문 트리를 해석하는 데 널리 사용되는 방법이 있습니까? 어휘 분석 이론은 멋지지 않습니다. 학문적 인 방식으로 대답하지 않으면 감사하겠습니다.

+0

제안 : A (상태, 문자)가 상태 머신 (state machine) 사용 -> (주, 옵션 <표준 : 기능 >) 전환 기능을. – lorro

답변

0

This은 GNU C 라이브러리를 사용할 수있는 경우 몇 가지 옵션으로 좋은 리소스입니다.

결국 각 arg를 전환하고 중첩 된 명령에 대한 상태를 추적해야 할 수 있습니다.

귀하의 예를 들어 인수 트리를 사용하여 :

switch (arg) 
{ 
    case "register": 
    { 
     register = 1; 
     break; 
    } 
    case "connection": 
    { 
     connection = 1; 
     break; 
    } 
    case "open": 
    { 
     if (previousCommand == "connection") 
      connectionOpen = 1; 
     else 
      //error 
     break; 
    } 
    case "switch": 
    { 
     if (previousCommand == "connection") 
      connectionSwitch = 1; 
     else 
      //error 
     break; 
    } 
    case "send": 
    { 
     send = 1; 
     break; 
    } 
    previousCommand = arg; 
} 
+2

'case' 문에 문자열을 사용할 수 없다고 확신합니다. – Galik

+0

답장을 보내 주셔서 감사합니다.하지만 각 명령에 상태를 사용하는 것은 좋지 않다고 생각합니다. 특히 명령 트리가 꽤 클 때. –

+0

@ 갤릭 물론 우리는 할 수 없습니다. 하지만 문자열을 고유 한 enum 값으로 변환하는 것은 그리 큰 문제는 아닙니다. –