私は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)
。
さまざまなソリューションは非効率的です。どうやってやるの?