Erlang 由于语法错误,Erl文件未编译

Erlang 由于语法错误,Erl文件未编译,erlang,ejabberd,Erlang,Ejabberd,我试图找出这段代码的错误,因为它给了我错误,使我无法将其正确编译到beam文件中。我看不出语法有什么问题。是否有一个IDE可以帮助我 以下是错误: parallels@parallels-Parallels-Virtual-Platform:/var/backend/ejabberd_modules# erlc -I /var/tmp/ejabberd/src/ mod_stanza_ack.erl ./mod_stanza_ack.erl:97: syntax e

我试图找出这段代码的错误,因为它给了我错误,使我无法将其正确编译到beam文件中。我看不出语法有什么问题。是否有一个IDE可以帮助我

以下是错误:

    parallels@parallels-Parallels-Virtual-Platform:/var/backend/ejabberd_modules# erlc -I         /var/tmp/ejabberd/src/ mod_stanza_ack.erl
   ./mod_stanza_ack.erl:97: syntax error before: '.'
   ./mod_stanza_ack.erl:98: syntax error before: Body
   ./mod_stanza_ack.erl:16: function route/3 undefined
   ./mod_stanza_ack.erl:3: Warning: behaviour gen_mod undefined
   ./mod_stanza_ack.erl:111: Warning: function strip_bom/1 is unused
   ./mod_stanza_ack.erl:114: Warning: function send_presence/3 is unused
   ./mod_stanza_ack.erl:120: Warning: function echo/3 is unused
   ./mod_stanza_ack.erl:123: Warning: function send_message/4 is unused
代码如下:

-module(mod_stanza_ack).
-behavior(gen_server).
-behavior(gen_mod).

-export([start_link/2]).

-export([start/2,
         stop/1,
         init/1,
         handle_call/3,
         handle_cast/2,
         handle_info/2,
         terminate/2,
         code_change/3]).

-export([route/3]).

-include("ejabberd.hrl").

-define(PROCNAME, ejabberd_mod_stanza_ack).
-define(BOTNAME, stanza_ack).

start_link(Host, Opts) ->
    Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
    gen_server:start_link({local, Proc}, ?MODULE, [Host, Opts], []).

start(Host, Opts) ->
    Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
    ChildSpec = {Proc,
        {?MODULE, start_link, [Host, Opts]},
        temporary,
        1000,
        worker,
        [?MODULE]},
    supervisor:start_child(ejabberd_sup, ChildSpec).

stop(Host) ->
    Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
    gen_server:call(Proc, stop),
    supervisor:terminate_child(ejabberd_sup, Proc),
    supervisor:delete_child(ejabberd_sup, Proc).

init([Host, Opts]) ->
    ?DEBUG("ECHO_BOT: Starting echo_bot", []),
    % add a new virtual host / subdomain "echo".example.com
    MyHost = gen_mod:get_opt_host(Host, Opts, "echo.@HOST@"),
    ejabberd_router:register_route(MyHost, {apply, ?MODULE, route}),
    {ok, Host}.

handle_call(stop, _From, Host) ->
    {stop, normal, ok, Host}.

handle_cast(_Msg, Host) ->
    {noreply, Host}.

handle_info(_Msg, Host) ->
    {noreply, Host}.

terminate(_Reason, Host) ->
    ejabberd_router:unregister_route(Host),
    ok.

code_change(_OldVsn, Host, _Extra) ->
    {ok, Host}.

% Checks a presence /subscription/ is a part of this.
% we may want to impliment blacklisting / some kind of
% protection here to prevent malicious users
%route(From, #jid{luser = ?BOTNAME} = To, {xmlelement, "presence", _, _} = Packet) ->
route(From, To, {xmlelement, "presence", _, _} = Packet) ->
    case xml:get_tag_attr_s("type", Packet) of
        "subscribe" ->
            send_presence(To, From, "subscribe");
        "subscribed" ->
            send_presence(To, From, "subscribed"),
            send_presence(To, From, "");
        "unsubscribe" ->
            send_presence(To, From, "unsubscribed"),
            send_presence(To, From, "unsubscribe");
        "unsubscribed" ->
            send_presence(To, From, "unsubscribed");
        "" ->
            send_presence(To, From, "");
        "unavailable" ->
            ok;
        "probe" ->
            send_presence(To, From, "");
        _Other ->
            ?INFO_MSG("Other kind of presence~n~p", [Packet])
    end,
    ok;

%route(From, #jid{luser = ?BOTNAME} = To, {xmlelement, "message", _, _} = Packet) ->
route(From, To, {xmlelement, "message", _, _} = Packet) ->
    case xml:get_subtag_cdata(Packet, "body") of
    "" ->
        ok.
    Body ->
        case xml:get_tag_attr_s("type", Packet) of

        "error" ->
            ?ERROR_MSG("Received error message~n~p -> ~p~n~p", [From, To, Packet]);
        _ ->
            echo(To, From, strip_bom(Body))
        end
    end,
    ok.

%% HELPER FUNCTIONS

strip_bom([239,187,191|C]) -> C;
strip_bom(C) -> C.

send_presence(From, To, "") ->
    ejabberd_router:route(From, To, {xmlelement, "presence", [], []});

send_presence(From, To, TypeStr) ->
    ejabberd_router:route(From, To, {xmlelement, "presence", [{"type", TypeStr}], []}).

echo(From, To, Body) ->
    send_message(From, To, "chat", Body).

send_message(From, To, TypeStr, BodyStr) ->
    XmlBody = {xmlelement, "message",
           [{"type", TypeStr},
        {"from", jlib:jid_to_string(From)},
        {"to", jlib:jid_to_string(To)}],
           [{xmlelement, "body", [],
         [{xmlcdata, BodyStr}]}]},
    ejabberd_router:route(From, To, XmlBody).

/mod\u stanza\u ack.erl:97:syntax error before:'。
表示错误在第97行。 在第97行,将
ok.
更改为
ok。这将解决问题


eclipse的Erlide插件是一个值得尝试的好IDE

/mod_stanza_ack.erl:97:'之前的语法错误。
表示错误在第97行。 在第97行,将
ok.
更改为
ok。这将解决问题


eclipse的Erlide插件是一个值得尝试的好IDE

在函数
route/3
的第97行
案例的第一个子句是

    "" ->
        ok.

<代码> ./COD>此处结束在Case< /C>中非法的函数,它应该是<代码>;<代码>。这也意味着解析器假定下一行的变量

Body
启动一个新函数,这也是非法的,因为函数名不能是变量

由于未定义功能
route/3
,因此无法导出该功能,这是导致第16行出现未定义功能错误的原因


有时编译器错误消息有点晦涩,但行号通常有用。

在函数
route/3
的第97行
案例的第一个子句是

    "" ->
        ok.

<代码> ./COD>此处结束在Case< /C>中非法的函数,它应该是<代码>;<代码>。这也意味着解析器假定下一行的变量

Body
启动一个新函数,这也是非法的,因为函数名不能是变量

由于未定义功能
route/3
,因此无法导出该功能,这是导致第16行出现未定义功能错误的原因

有时编译器错误消息有点神秘,但行号通常会有所帮助