이 문제는 일부 닫는 괄호가 생략 된 표현식에서 괄호를 일치시키는 문제와 정확히 유사합니다. 여기에 "if"(또는a 대표적인 문법에서)는 열린 괄호와 "else"(b)는 가까운 괄호입니다. (의 순서에서a모래 b기계적으로 삽입 할 수 있습니다 c각각 앞에 하나를 배치하여 b 괄호 뇌에 더 잘 맞기 때문에 문제가있는 것처럼 씁니다.
기존의 "가장 근접한"댕글 링-해상도는 가장 근접한 가장 최근의 열림과 각각 일치합니다. 즉, 일치하는 열기와 일치하는 닫기 사이에 일치하지 않는 열기 (또는 해당 문제에 대한 닫기)가 없습니다.
가능한 대안 중 하나는 가장 근접한 가장 빠른 오픈과 각각의 클로저를 일치시키는 것입니다. 여기서 "가능한"은 괄호 중첩을 위반하지 않고 오픈을 일치시킬 수 있음을 의미합니다 (예 : 첫 번째( 에 ()() 마지막과 일치 할 수 없다 )).
이 일치는 외부에서 수행되어야하므로 모든 묶음 쌍이 일치 할 때까지 닫기에 대한 일치가 시도되지 않습니다. 이 사실은 구문 분석이 알고리즘을 사용하여 구문 분석을 생성하는 것을 불가능하게 만듭니다. 구문 분석은 문자열을 완전히 일치하는 세그먼트로 분할 한 후 (끝이 일치하는 범위를 효과적으로 제한하기 때문에) 양쪽 끝에서 안쪽으로 작동해야하기 때문입니다.
그러나 온라인 왼쪽에서 오른쪽 파서가 존재하지 않는다고해서 CFG가 명확하지 않다는 것을 의미하지는 않습니다. (아마도 : 회문 언어는 양쪽 끝에서 중간쪽으로 구문 분석해야하지만 명확한 문법을 작성하는 것은 쉽습니다).
"가장 일치하는"괄호 문제에 대한 문법을 만들기 위해 필자는 필적 할 수없는 오픈 뒤에는 일치하는 오픈이 올 수 없다는 사실에 의존했습니다. 일치하는 경우 일치하지 않는 열기가 일치하는 열기의 닫기와 일치 할 수 있기 때문에 가장 일치하는 속성이 적용되지 않으므로 일치하지 않는 것이 가장 일치하는 속성을 위반합니다.
여기 약간 어색한 문법이 있습니다 :
SUMT→U|M→T|aUbT|aUbc|aMbU→aMbM|c→aT|ac
S 시작 기호입니다. M 완전히 일치하는 진술입니다. U 확실히 일치하지 않는 진술입니다. a이므로 비워 둘 수 없습니다.) T 타의 추종을 불허하는 "꼬리" a에스. 일치하지 않는 개방형에 대한 위의 사실은 문법에서 직접 읽을 수 있습니다. 일치하지 않는 모든 개방형은T, ㅏ T 끝에 만 나타날 수 있습니다 U, 그리고 U 뒤에 만 올 수 있습니다 T.
어지러움은 예방에서 비롯됩니다 U빈 문자열과 일치하지 않습니다. 그것은 내가 모호한 모호성을 고려하는 것을 방지합니다. 개방과 닫힘의 일치가 모든 대체 파싱에서 동일하다는 점에서 가짜입니다. 만약Unull을 허용하면 완전히 균형 잡힌 문자열을 파생시킵니다. 이후S 사실상 M∗U, 그것은 당신이 완전히 균형 잡힌 것을 고려할 수있는 모호성을 초래합니다 S 일련의 M 뒤에 빈 U또는 하나 이하 M 완전히 균형 잡힌 U.
아마 내가 선택한 것보다 더 나은 해결 방법이있을 것입니다. 그러나 이것은 효과가있는 것으로 보이며 Bison의 GLR 파서와 잘 어울립니다. 그 파서는 모호성을 처리하기 위해 추가 코드를 작성하지 않는 한 모호한 구문 분석에 대해 불평하며 너무 게으르지 않습니다. 나는 최대 20 개의 open + closes 문자열로 테스트했으며 올바르게 중첩 된 모든 시퀀스에 대해 명확하게 중첩 된 시퀀스에 대한 구문 분석을 생성하지 않고 명확한 구문 분석을 생성 한 것으로 보입니다.