2013-01-16 5 views
3

Prolog에 구문 분석기를 썼습니다. 나는 아직 끝나지 않았다. 그것은 코드의 일부입니다. 다음 단계는 문자열의 모든 공백을 제거하는 것입니다. 예를 들어Prolog에서 문자열에서 공백 제거

parse(Source, Tree) :- kill_whitespace(Source, CleanInput), % remove whitespaces 
         actual_parse(CleanInput, Tree). 

actual_parse(CleanInput, Tree):- phrase(expr(Tree),CleanInput). 

expr(Ast) --> term(Ast1), expr_(Ast1,Ast). 
expr_(Acc,Ast) --> " + ", !, term(Ast2), expr_(plus(Acc,Ast2), Ast). 
expr_(Acc,Ast) --> " - ", !, term(Ast2), expr_(minus(Acc,Ast2), Ast). 
expr_(Acc,Acc) --> []. 

term(Ast) --> factor(Ast1), term_(Ast1,Ast). 
term_(Acc,Ast) --> " * ", !, factor(Ast2), term_(mul(Acc,Ast2),Ast). 
term_(Acc,Ast) --> " ** ", !, factor(Ast2), term_(pol(Acc,Ast2),Ast). 
term_(Acc,Acc) --> []. 

factor(Ast) --> "(", !, expr(Ast), ")". 
factor(D)--> [X], { X >= 48 , X=<57 , D is X-48 }. 
factor(id(N,E)) --> "x", factor(N), ":=", expr(E), ";". 

:

?- parse("x2:=4",T). 
    T = id(2, 4) 

사실!

?- parse("x2 := 4",T). 
false. 

그것은뿐만 아니라 사실이 있어야하며 필터해야한다 : 그러나, 때 나는 쓰기 kill_whitespace(Source, CleanInput).

다른 솔루션은 비효율적입니다. 어떻게하면됩니까?

답변

1

공간이 발생할 수 있습니다. 이러한 스킵은 일반적으로 주석뿐만 아니라 다른 '흥미롭지 않은'텍스트를 버립니다.

는 가능한 한 간단로 유지하려면 :
% discard any number of spaces 
s --> "" ; " ", s. 

내가 깨끗한 문법을 ​​유지하기 위해, 짧은 이름을 선호한다. 뿐만 아니라 등등 줄 바꿈을 삭제하려면 :

s --> "" ; (" ";"\t";"\n";"\r"), s. 

A '스타일'참고 : 대신

parse(Source, Tree) :- 
    expr(Tree, Source, []). 

당신이

parse(Source, Tree) :- 
    phrase(expr(Tree), Source). 
1

글쎄, 쉬운 방법은 문자열을 구문 분석하고 공백을 제거하는 것입니다/비 - whispace만을 filter predicate으로 유지하는 것입니다. 그러나 두 번째 파싱이 필요합니다.

는 문자를 "GET"자신 만의 술어를 사용하는 것입니다 해결하려는 다른 방법으로,
foo --> "a".이된다 foo --> get("a").get//1입니다 무언가 같이 여기서 I는 일반적으로 '건너 뛰기'비 터미널을 배치

get(X) --> [X]. 
get(X) --> whitespace, get(X). 
+0

필터는 내부 문자열과 같이 필요한 경우 * 공백을 유지하기 어렵게 만듭니다. 또한 토큰을 분리하는 데 필요한 공간이있을 수 있습니다. 사실이라면 마지막 사례는 내가 제안한 생략 술어에서도 처리되지 않습니다 ... – CapelliC

+0

@CapelliC 실제로. 입력을 토큰 화하고 모든 공백/문자열/etc 문제를 처리 한 다음 구문 분석하는 것이 더 낫습니다. –

0

파서를 작성하는 일반적인 방법이다 고려할 수

첫 번째 단계는 어휘 분석를 수행합니다.() 토큰을 생성한다. 이 시점에서 구문 분석 (예 : 주석)에 중요하지 않은 공백 및 기타 "토큰"은 무시됩니다.

두 번째 단계는 구문 분석 자체를 실행하여 어휘 분석기에서 생성 된 토큰 목록을 검사합니다.