46
43
process(L, Stream,Lno,R) when is_list(L) ->
47
44
%%io:format('read:~s',[L]),
48
case catch tokenise(L,Lno) of
45
case catch tokenise(Stream,L,Lno,[]) of
50
47
io:format("Tokeniser error on line: ~w ~w~n",[Lno,Reason]),
52
{multiline_comment,NestingLevel} ->
53
{RestL,Lno2} = process_skip_multiline_comment(Stream,Lno,NestingLevel),
54
process(RestL,Stream,Lno2,R);
56
50
%%io:format('toks:~w~n',[T]),
57
process(Stream,Lno,[T|R])
51
process(Stream,NewLno,[T|R])
60
process_skip_multiline_comment(Stream,Lno,NestingLevel) ->
61
process_skip_multiline_comment(io:get_line(Stream, ''),
62
Stream, Lno + 1, NestingLevel).
63
process_skip_multiline_comment(eof,_Stream,Lno,_NestingLevel) ->
64
io:format("Tokeniser error on line: ~w, premature end of multiline comment~n",[Lno]),
66
process_skip_multiline_comment(Line,Stream,Lno,NestingLevel) ->
67
case catch skip_multiline_comment(Line,NestingLevel) of
68
{multiline_comment,NestingLevel2} ->
69
process_skip_multiline_comment(Stream,Lno,NestingLevel2);
74
tokenise([H|T],Lno) when $a =< H , H =< $z ->
54
tokenise(Stream,[H|T],Lno,R) when $a =< H , H =< $z ->
75
55
{X, T1} = get_name(T, [H]),
76
[{identifier,Lno, list_to_atom(X)}|tokenise(T1,Lno)];
78
tokenise([$&,H|T],Lno) when $A =< H , H =< $Z ->
79
{Y, T1} = get_name(T, [H]),
81
[{typefieldreference, Lno, X} | tokenise(T1, Lno)];
83
tokenise([$&,H|T],Lno) when $a =< H , H =< $z ->
84
{Y, T1} = get_name(T, [H]),
86
[{valuefieldreference, Lno, X} | tokenise(T1, Lno)];
88
tokenise([H|T],Lno) when $A =< H , H =< $Z ->
56
tokenise(Stream,T1,Lno,[{identifier,Lno, list_to_atom(X)}|R]);
58
tokenise(Stream,[$&,H|T],Lno,R) when $A =< H , H =< $Z ->
59
{Y, T1} = get_name(T, [H]),
61
tokenise(Stream,T1,Lno,[{typefieldreference, Lno, X} | R]);
63
tokenise(Stream,[$&,H|T],Lno,R) when $a =< H , H =< $z ->
64
{Y, T1} = get_name(T, [H]),
66
tokenise(Stream,T1,Lno,[{valuefieldreference, Lno, X} | R]);
68
tokenise(Stream,[H|T],Lno,R) when $A =< H , H =< $Z ->
89
69
{Y, T1} = get_name(T, [H]),
90
70
X = list_to_atom(Y),
91
71
case reserved_word(X) of
93
[{X,Lno}|tokenise(T1,Lno)];
73
tokenise(Stream,T1,Lno,[{X,Lno}|R]);
95
[{typereference,Lno,X}|tokenise(T1,Lno)];
75
tokenise(Stream,T1,Lno,[{typereference,Lno,X}|R]);
97
[{restrictedcharacterstringtype,Lno,X}|tokenise(T1,Lno)]
77
tokenise(Stream,T1,Lno,[{restrictedcharacterstringtype,Lno,X}|R])
100
tokenise([$-,H|T],Lno) when $0 =< H , H =< $9 ->
101
{X, T1} = get_number(T, [H]),
102
[{number,Lno,-1 * list_to_integer(X)}|tokenise(T1,Lno)];
104
tokenise([H|T],Lno) when $0 =< H , H =< $9 ->
105
{X, T1} = get_number(T, [H]),
106
[{number,Lno,list_to_integer(X)}|tokenise(T1,Lno)];
108
tokenise([$-,$-|T],Lno) ->
109
tokenise(skip_comment(T),Lno);
111
tokenise([$/,$*|T],Lno) ->
112
tokenise(skip_multiline_comment(T,0),Lno);
114
tokenise([$:,$:,$=|T],Lno) ->
115
[{'::=',Lno}|tokenise(T,Lno)];
117
tokenise([$'|T],Lno) ->
80
tokenise(Stream,[$-,H|T],Lno,R) when $0 =< H , H =< $9 ->
81
{X, T1} = get_number(T, [H]),
82
tokenise(Stream,T1,Lno,[{number,Lno,-1 * list_to_integer(X)}|R]);
84
tokenise(Stream,[H|T],Lno,R) when $0 =< H , H =< $9 ->
85
{X, T1} = get_number(T, [H]),
86
tokenise(Stream,T1,Lno,[{number,Lno,list_to_integer(X)}|R]);
88
tokenise(Stream,[$-,$-|T],Lno,R) ->
89
tokenise(Stream,skip_comment(T),Lno,R);
91
tokenise(Stream,[$/,$*|T],Lno,R) ->
92
{NewLno,T1} = skip_multiline_comment(Stream,T,Lno,0),
93
tokenise(Stream,T1,NewLno,R);
95
tokenise(Stream,[$:,$:,$=|T],Lno,R) ->
96
tokenise(Stream,T,Lno,[{'::=',Lno}|R]);
98
tokenise(Stream,[$'|T],Lno,R) ->
118
99
case catch collect_quoted(T,Lno,[]) of
120
101
throw({'ERR','bad_quote'});
122
[Thing|tokenise(T1,Lno)]
103
tokenise(Stream,T1,Lno,[Thing|R])
125
tokenise([$"|T],Lno) ->
126
collect_string(T,Lno);
128
tokenise([${|T],Lno) ->
129
[{'{',Lno}|tokenise(T,Lno)];
131
tokenise([$}|T],Lno) ->
132
[{'}',Lno}|tokenise(T,Lno)];
134
tokenise([$]|T],Lno) ->
135
[{']',Lno}|tokenise(T,Lno)];
137
tokenise([$[|T],Lno) ->
138
[{'[',Lno}|tokenise(T,Lno)];
140
tokenise([$,|T],Lno) ->
141
[{',',Lno}|tokenise(T,Lno)];
143
tokenise([$(|T],Lno) ->
144
[{'(',Lno}|tokenise(T,Lno)];
145
tokenise([$)|T],Lno) ->
146
[{')',Lno}|tokenise(T,Lno)];
148
tokenise([$.,$.,$.|T],Lno) ->
149
[{'...',Lno}|tokenise(T,Lno)];
151
tokenise([$.,$.|T],Lno) ->
152
[{'..',Lno}|tokenise(T,Lno)];
154
tokenise([$.|T],Lno) ->
155
[{'.',Lno}|tokenise(T,Lno)];
156
tokenise([$^|T],Lno) ->
157
[{'^',Lno}|tokenise(T,Lno)];
158
tokenise([$!|T],Lno) ->
159
[{'!',Lno}|tokenise(T,Lno)];
160
tokenise([$||T],Lno) ->
161
[{'|',Lno}|tokenise(T,Lno)];
164
tokenise([H|T],Lno) ->
106
tokenise(Stream,[$"|T],Lno,R) ->
107
{Str,T1} = collect_string(T,Lno),
108
tokenise(Stream,T1,Lno,[Str|R]);
110
tokenise(Stream,[${|T],Lno,R) ->
111
tokenise(Stream,T,Lno,[{'{',Lno}|R]);
113
tokenise(Stream,[$}|T],Lno,R) ->
114
tokenise(Stream,T,Lno,[{'}',Lno}|R]);
116
%% tokenise(Stream,[$],$]|T],Lno,R) ->
117
%% tokenise(Stream,T,Lno,[{']]',Lno}|R]);
119
%% Even though x.680 specify '[[' and ']]' as lexical items
120
%% it does not work to have them as such since the single [ and ] can
121
%% be used beside each other in the SYNTAX OF in x.681
122
%% the solution chosen here , i.e. to have them as separate lexical items
123
%% will not detect the cases where there is white space between them
124
%% which would be an error in the use in ExtensionAdditionGroups
126
%% tokenise(Stream,[$[,$[|T],Lno,R) ->
127
%% tokenise(Stream,T,Lno,[{'[[',Lno}|R]);
129
tokenise(Stream,[$]|T],Lno,R) ->
130
tokenise(Stream,T,Lno,[{']',Lno}|R]);
132
tokenise(Stream,[$[|T],Lno,R) ->
133
tokenise(Stream,T,Lno,[{'[',Lno}|R]);
135
tokenise(Stream,[$,|T],Lno,R) ->
136
tokenise(Stream,T,Lno,[{',',Lno}|R]);
138
tokenise(Stream,[$(|T],Lno,R) ->
139
tokenise(Stream,T,Lno,[{'(',Lno}|R]);
140
tokenise(Stream,[$)|T],Lno,R) ->
141
tokenise(Stream,T,Lno,[{')',Lno}|R]);
143
tokenise(Stream,[$.,$.,$.|T],Lno,R) ->
144
tokenise(Stream,T,Lno,[{'...',Lno}|R]);
146
tokenise(Stream,[$.,$.|T],Lno,R) ->
147
tokenise(Stream,T,Lno,[{'..',Lno}|R]);
149
tokenise(Stream,[$.|T],Lno,R) ->
150
tokenise(Stream,T,Lno,[{'.',Lno}|R]);
151
tokenise(Stream,[$^|T],Lno,R) ->
152
tokenise(Stream,T,Lno,[{'^',Lno}|R]);
153
tokenise(Stream,[$!|T],Lno,R) ->
154
tokenise(Stream,T,Lno,[{'!',Lno}|R]);
155
tokenise(Stream,[$||T],Lno,R) ->
156
tokenise(Stream,T,Lno,[{'|',Lno}|R]);
158
tokenise(Stream,[H|T],Lno,R) ->
165
159
case white_space(H) of
161
tokenise(Stream,T,Lno,R);
169
[{list_to_atom([H]),Lno}|tokenise(T,Lno)]
163
tokenise(Stream,T,Lno,[{list_to_atom([H]),Lno}|R])
165
tokenise(_Stream,[],Lno,R) ->
166
{Lno,lists:reverse(R)}.
175
169
collect_string(L,Lno) ->