-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathlexgrm.erl
46 lines (41 loc) · 1.34 KB
/
lexgrm.erl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
-module(lexgrm).
-export([ start/0
, parse_cmd/1
]).
%% Generate lexer and parser
%% We should only distribute the .erl files with skeleton
start() ->
leex:file(lex), %% lex.xrl -> lex.erl
compile:file(lex), %% lex.erl -> lex.beam
yecc:file(grm), %% grm.yrl -> grm.erl
compile:file(grm), %% grm.erl -> grm.beam
ok.
%% Making a parser of the command line.
%% It returns:
%% {msg, String}
%% {connect, Server}
%% {join, Channel}
%% ignore
%%
%% The token ignore is used to avoid sending a failed command
%% as a message.
parse_cmd(Line) ->
case lex:string(Line) of
{error,_, _} -> tried_a_cmd(Line) ;
{ok, Tokens, _} ->
case grm:parse(Tokens) of
{ok, Cmd} -> Cmd ;
{error,_} -> tried_a_cmd(Tokens,Line)
end
end.
tried_a_cmd(Line) ->
case string:str(string:strip(Line),"/") of
1 -> {ignore, Line} ;
_ -> {msg, Line}
end.
tried_a_cmd([{'/connect',_,_} | _],Line) -> {ignore,Line} ;
tried_a_cmd([{'/join',_,_} | _],Line) -> {ignore,Line} ;
tried_a_cmd([{'/nick',_,_} | _],Line) -> {ignore,Line} ;
tried_a_cmd([{'/ping',_,_} | _],Line) -> {ignore,Line} ;
tried_a_cmd([{'/whoami',_,_} | _],Line) -> {ignore,Line} ;
tried_a_cmd(_,Line) -> {msg, Line}.