13
13
%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
14
14
%% AB. All Rights Reserved.''
19
19
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
20
20
% The parser generator will insert appropriate declarations before this line.%
23
case catch yeccpars1(Tokens, false, 0, [], []) of
26
if Tokens == [] -> 0; true -> element(2, hd(Tokens)) end,
28
{Errorline, ?THIS_MODULE, "syntax error at or after this line."}};
23
yeccpars0(Tokens, false).
33
parse_and_scan({Mod, Fun, Args}) ->
34
case apply(Mod, Fun, Args) of
37
{error, Descriptor, _} ->
40
yeccpars1(Tokens, {Mod, Fun, Args}, 0, [], [])
25
parse_and_scan({F, A}) -> % Fun or {M, F}
26
yeccpars0([], {F, A});
27
parse_and_scan({M, F, A}) ->
28
yeccpars0([], {{M, F}, A}).
43
30
format_error(Message) ->
44
31
case io_lib:deep_char_list(Message) of
48
35
io_lib:write(Message)
51
% To be used in grammar files to throw an error message to the parser toplevel.
52
% Doesn't have to be exported!
38
% To be used in grammar files to throw an error message to the parser
39
% toplevel. Doesn't have to be exported!
40
-compile({nowarn_unused_function,{return_error,2}}).
53
41
return_error(Line, Message) ->
54
throw({error, {Line, ?THIS_MODULE, Message}}).
42
throw({error, {Line, ?MODULE, Message}}).
44
yeccpars0(Tokens, MFA) ->
45
try yeccpars1(Tokens, MFA, 0, [], [])
47
throw: {error, {_Line, ?MODULE, _M}} = Error ->
48
Error % probably from return_error/1
57
51
% Don't change yeccpars1/6 too much, it is called recursively by yeccpars2/8!
58
52
yeccpars1([Token | Tokens], Tokenizer, State, States, Vstack) ->
59
53
yeccpars2(State, element(1, Token), States, Vstack, Token, Tokens,
61
yeccpars1([], {M, F, A}, State, States, Vstack) ->
62
case catch apply(M, F, A) of
64
{error, {Endline, ?THIS_MODULE, "end_of_file"}};
55
yeccpars1([], {F, A}, State, States, Vstack) ->
57
{ok, Tokens, _Endline} ->
58
yeccpars1(Tokens, {F, A}, State, States, Vstack);
60
yeccpars1([], false, State, States, Vstack);
65
61
{error, Descriptor, _Endline} ->
68
{error, {0, ?THIS_MODULE, Reason}};
69
{ok, Tokens, _Endline} ->
70
case catch yeccpars1(Tokens, {M, F, A}, State, States, Vstack) of
72
Errorline = element(2, hd(Tokens)),
73
{error, {Errorline, ?THIS_MODULE,
74
"syntax error at or after this line."}};
79
64
yeccpars1([], false, State, States, Vstack) ->
80
65
yeccpars2(State, '$end', States, Vstack, {'$end', 999999}, [], false).
93
78
yecctoken2string({string,_,S}) -> io_lib:write_string(S);
94
79
yecctoken2string({reserved_symbol, _, A}) -> io_lib:format('~w', [A]);
95
80
yecctoken2string({_Cat, _, Val}) -> io_lib:format('~w', [Val]);
97
81
yecctoken2string({'dot', _}) -> io_lib:format('~w', ['.']);
98
82
yecctoken2string({'$end', _}) ->
100
yecctoken2string({Other, _}) when atom(Other) ->
84
yecctoken2string({Other, _}) when is_atom(Other) ->
101
85
io_lib:format('~w', [Other]);
102
86
yecctoken2string(Other) ->
103
87
io_lib:write(Other).
105
89
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%