📄 parser.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 + -