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)
.
다른 솔루션은 비효율적입니다. 어떻게하면됩니까?
필터는 내부 문자열과 같이 필요한 경우 * 공백을 유지하기 어렵게 만듭니다. 또한 토큰을 분리하는 데 필요한 공간이있을 수 있습니다. 사실이라면 마지막 사례는 내가 제안한 생략 술어에서도 처리되지 않습니다 ... – CapelliC
@CapelliC 실제로. 입력을 토큰 화하고 모든 공백/문자열/etc 문제를 처리 한 다음 구문 분석하는 것이 더 낫습니다. –