scanner.pl

来自「一个编译器的源程序」· PL 代码 · 共 40 行

PL
40
字号
/* Scanner */

init_scanner(Datei):-
  see(Datei), 
  readln(Eingabe, _, ".", "0123456789", lowercase), 
  seen,
  scan(Eingabe, Symbole),
  retractall(symbole(_)), asserta(symbole(Symbole)).

symbol(Symbol):-
  symbole([Symbol|_]).
 
next_symbol:-
  retract(symbole([_|Symbole])),
  asserta(symbole(Symbole)).

reserviert(X):- 
  member(X, [while, do, begin, end, write, program, if, then, else]).

/* Symbole bilden */ 

scan([Symbol1, Symbol2|Symbole1], [Symbol3|Symbole3]):-
  zusammensetzen(Symbol1, Symbol2, Symbol3), !,
  scan(Symbole1, Symbole3).
scan([Symbol1|Symbole1], [Symbol2|Symbole2]):-
  verpacken(Symbol1, Symbol2), !,
  scan(Symbole1, Symbole2).
scan([], []).

zusammensetzen(<, =, <=).
zusammensetzen(<, >, <>).
zusammensetzen(>, =, >=).
zusammensetzen(:, =, :=).

verpacken(Symbol, bez(Symbol)):-
  name(Symbol, [K|_]), 
  is_alpha(K), 
  \+ reserviert(Symbol).
verpacken(Symbol, Symbol).

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?