⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parser.pl

📁 一个编译器的源程序
💻 PL
字号:
/* Parser fuer mini-PASCAL */

:- consult(scanner).

parse_programm(Datei, Parsebaum):-
  init_scanner(Datei), 
  parse_programm(Parsebaum), !.
  
parse_programm(Anweisungen):-
  parse_symbol(program), 
  parse_variable(_Name),
  parse_symbol(;),
  parse_anweisung(begin(Anweisungen)),
  parse_symbol(.).  
  
parse_anweisungen([Anweisung|Anweisungen]):-
  parse_anweisung(Anweisung), 
  (parse_symbol(;) ->   /* if .. then .. else .. */
     parse_anweisungen(Anweisungen);
     Anweisungen = []).

parse_anweisung(zuweisung(Variable, Ausdruck)):-
  parse_variable(Variable), !,
  parse_symbol(:=),
  parse_ausdruck(Ausdruck).
  
parse_anweisung(while(Ausdruck, Anweisung)):-
  parse_symbol(while), !,
  parse_ausdruck(Ausdruck),
  parse_symbol(do),
  parse_anweisung(Anweisung).
  
parse_anweisung(if(Ausdruck, Anweisung1, Anweisung2)):-
  parse_symbol(if), !,
  parse_ausdruck(Ausdruck),
  parse_symbol(then),
  parse_anweisung(Anweisung1),
  (parse_symbol(else) ->
     parse_anweisung(Anweisung2);
     Anweisung2 = nil).

parse_anweisung(begin(Anweisungen)):-
  parse_symbol(begin), !,
  parse_anweisungen(Anweisungen),
  parse_symbol(end).
  
parse_anweisung(write(Ausdruck)):-
  parse_symbol(write), !,
  parse_symbol('('),
  parse_ausdruck(Ausdruck),
  parse_symbol(')').

parse_anweisung(nil).

parse_ausdruck(Ausdruck):-
  parse_einfacher_ausdruck(Ausdruck1),
  parse_ausdruck(Ausdruck1, Ausdruck).
parse_ausdruck(Ausdruck1, Ausdruck1 < Ausdruck2):-
  parse_symbol(<), !,
  parse_einfacher_ausdruck(Ausdruck2).
parse_ausdruck(Ausdruck1, Ausdruck1 = Ausdruck2):-
  parse_symbol(=), !,
  parse_einfacher_ausdruck(Ausdruck2).
parse_ausdruck(Ausdruck, Ausdruck).

parse_einfacher_ausdruck(Einfacher_Ausdruck):-
  parse_term(Term),
  parse_einfacher_ausdruck(Term, Einfacher_Ausdruck).
parse_einfacher_ausdruck(Term1, Einfacher_Ausdruck):-
  parse_symbol(+), !,
  parse_term(Term2),
  parse_einfacher_ausdruck(Term1 + Term2, Einfacher_Ausdruck).
parse_einfacher_ausdruck(Term1, Einfacher_Ausdruck):-
  parse_symbol(-), !,
  parse_term(Term2),
  parse_einfacher_ausdruck(Term1 - Term2, Einfacher_Ausdruck).
parse_einfacher_ausdruck(Einfacher_Ausdruck, Einfacher_Ausdruck).

parse_term(Term):-
  parse_faktor(Faktor),
  parse_term(Faktor, Term).
parse_term(Faktor1, Term):-
  parse_symbol(*), !,
  parse_faktor(Faktor2),
  parse_term(Faktor1 * Faktor2, Term).
parse_term(Faktor1, Term):-
  parse_symbol(/), !,
  parse_faktor(Faktor2),
  parse_term(Faktor1 / Faktor2, Term).
parse_term(Term, Term).
   
parse_faktor(Faktor):-
  parse_symbol('('),
  parse_ausdruck(Faktor),
  parse_symbol(')').

parse_faktor(Faktor):-
  parse_symbol(+),
  parse_faktor(Faktor).

parse_faktor(- Faktor):-
  parse_symbol(-),
  parse_faktor(Faktor).

parse_faktor(Faktor):-
  parse_zahl(Faktor).

parse_faktor(Variable):-
  parse_variable(Variable).

parse_zahl(Zahl):-  
  symbol(Zahl),
  integer(Zahl), 
  next_symbol.

parse_variable(Bezeichner):-
  symbol(bez(Bezeichner)),
  next_symbol.
  
parse_symbol(Symbol):-
  symbol(Symbol),
  next_symbol.  

⌨️ 快捷键说明

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