2013-03-17 2 views
1

그 표준을 알고 ...
의 우리가 문자열 ONE|(TWO|(THREE|FOUR))을 가정 해 봅시다 : 정규식 은하지 않습니다 지원 재귀, 우리는 아래로이 문자열에 침입 할 수있는 방법는 C에서 표현의 내용을 교체 ++ [표준 : 정규식]

  • THREE|FOUR
  • TWO|{0}
  • ONE|{1}
(순서)을 포함 문자열의 표준 : 벡터

위의 방식으로 이것을 변환하는 목적은 중첩 된 if/then 문을 의미 론적으로 나타내야하는 통과 식 목록을 만드는 것입니다. 어떻게 이것을 달성 할 수 있습니까? 당신은 가장 안쪽의 컨텐츠를 원하기 때문에

+0

bison과 같은 구문 분석 소프트웨어를 사용 하시겠습니까? – Barmar

+0

@Barmar 사실, 필자는 [ANTLR] (http://www.antlr.org)과 매우 흡사 한 내 자신의 문법 명세를 사용하여 내 자신의 lexer/parser를 만들고 있습니다. 위의 목적을 달성하는 것은 파싱 코드를 생성하는 것입니다. – RectangleEquals

+0

그런 다음 파서 작성에 대한 좋은 교과서를 읽으십시오.이 책자를 구현하는 방법을 설명해야합니다. – Barmar

답변

1

먼저 게으른/ungreedy 정규식 동작을 사용하고 (.*?)\) 또는 모든하지만 \([^\)\(]+에 괄호가있는 )까지 모든 것을 일치시킬 수 있습니다.

의사 코드 :

while (regex_match(string, regex)) { 
    add matches to vector 
    replace matches in string with vector index in curly brackets 
} 

예 정규식 : 여기 ((?:\(|^)[^\)\(]+(?:\)|$))
정규식 데모 : 렉싱을 수행하는 정규식 라이브러리를 사용하여 http://regex101.com/r/pJ4pO7

+0

나는 이것을 구현하려고 시도했다. (http://pastebin.com/QqPmiuxy). 다만 구현을 올바르게 할 수는 없다. [여기에 출력을 보자] (http://pastebin.com)./dTARZ93g), 무한 루프로 들어갑니다 ... 내가 뭘 잘못하고 있니? – RectangleEquals

+1

C를 많이 알지는 않지만 예제에서와 같은 레벨에 여러 개의 일치 항목이 있고 다음과 같은 정규 표현식을 사용하면 search_all과 같은 것을 사용해야합니다 :'^ <\\d+> $'루프를 멈추기 위해서 –

+0

실제로 나는 깨달았습니다. 출력이 실제로 정확하다는 것, 그리고 내가 제공 한 출구 전략이 필요한 것입니다. 감사! – RectangleEquals

2

이 아닌 사소한 아무것도 갈 수있는 끔찍한 방법입니다. 당신이 경기를하게되면 을 알지 못합니다. 어떤 후 처리 과정없이이 무엇을 찾았습니까? 써드 파티 라이브러리를 사용하고 싶지 않다면 우선 자신 만의 렉서 제너레이터를 작성하고 싶은지 심각하게 자문 해봐야합니다. 원하는 경우 팁을 제공해 드리겠습니다.

신뢰할 수있는 렉싱 작업을 시작하면 다음 부분을 훨씬 쉽게 찾을 수 있습니다. 그런 다음 임시 파서를 작성하거나 직접 파서 생성기를 작성할 수 있습니다.