2011-03-08 3 views
1

저는 preg_match_all을 사용하여 간단한 파서를 만듭니다. 단 몇 문장 만 파싱하므로 성능은 중요하지 않습니다. Context free grammer를 통해 파싱하는 파서를 만들 수 있습니까?PHP preg_match_all을 사용하여 간단한 CFG 파서를 어떻게 구현할 수 있습니까?

S -> NP VP 
PP -> P NP 
NP -> 'the' N | N PP | 'the' N PP 
VP -> V NP | V PP | V NP PP 
N -> 'cat' 
N -> 'dog' 
N -> 'rug' 
V -> 'chased' 
V -> 'sat' 
P -> 'in' 
P -> 'on' 

여기서 내가 해결할 수없는 문제는 루프입니다.

예를 들어, PP -> NP -> PP가 될 수있는 곳의 루프를 볼 수 있습니까?

이 문제를 해결할 수있는 푸시 다운 오토 마타처럼 작동하는 PHP가 있습니까?

예시 입력 '고양이 개 쫓아'

예제 출력 :

(S (NP 제 (N 고양이)) (VP (V 쫓아) (NP 제 (N 개))))

예 입력 :

출력 예 (들) :

(S (NP 제 (N 고양이)) "고양이는 깔 개 쫓아 ' (VP (S (NP 제 (N 고양이가)) 이 (VP (V가 쫓아

))() NP 제 (N 개) (PP (에 P) (NP 제 (N 양탄자를))) (V 추격)) (NP the (N 개)) (NP (N 개))))

+0

출력이 얼마입니까? 문장이 문법에서 유효한지 아닌지, 또는 일종의 데이터 구조를 반환해야만 하는가? –

+0

데이터 구조 반환이 필요합니다. – user482594

+0

주어진 입력에 대해 원하는 결과의 예를 들려 줄 수 있습니까? –

답변

1

일반적인 방법은 예측 파서를 작성하는 것입니다. 이것은 정규 표현식을 사용하여 명사, 동사 또는 조건자를 일치시킨 다음 사용할 저작물을 결정하는 것을 의미 할 수 있습니다. 문법을 파싱하는 것이 푸시 다운 오토 마톤 (즉, 정규 표현식 만이 달성 할 수있는 것 이상)의 계산 능력을 필요로한다는 것이 맞습니다. 푸시 다운 오토 마톤을 시뮬레이션하는 것이 한 가지 방법이며 yacc/bison과 같은 파서 생성기가 자주 수행하는 것입니다. 그런 작은 문법을 위해서 암묵적으로 호출 스택을 사용할 수 있습니다.

+0

예제 코드가 있습니까? 인터넷 검색을 통해 찾은 코드 만 정규 표현식입니다 ... 아마 PHP가이 용도에 너무 제한적일 수 있습니다. – user482594

+0

@ user482594 PHP를 모르므로 해당 언어의 예제 코드를 사용할 수 없습니다. 다음은 Java http://www.cs.arizona.edu/~collberg/Teaching/453/2009/Handouts/Handout-8.pdf로 작성된 예측 파서에 대한 링크입니다. – Samsdram

관련 문제