Inhalt: Beispielprogramm zur Auswertung natrlichsprachlicher Ausdrcke. 
Autor:  Hans Lei, CIS, Universitt Mnchen, 9.6.2004

Systemanforderungen: 

Es mu SML/NJ in einer Version > 110.42 installiert sein, ein-
schlielich der Programme mllex und mlyacc, die in der Distribution 
von SML/NJ enthalten sind. (Anpassung an Version 110.0.3 siehe unten.)

Dokumentation zu SML/NJ, ML-Lex, ML-Yacc:

Online-Handbcher zu SML/NJ sowie ML-Lex und ML-Yacc findet man auf der 
www-Seite der LMU/IFI/Rechnerbetriebsgruppe unter: Programmiersprachen/Sonstige.

Dateien:

Die Beispielsprache QNL mit Syntax- und Auswertungsregeln ist in qnl.grm 
(im Stil von ML-Yacc) und der Tokenizer in nl.lex (im Stil von ML-Lex) 
definiert. 
Mit den Hilfsdateien nl.interface.sml, nl.link.sml und einer der Be-
schreibungsdateien nl.cm oder qnl.cm erzeugt der 'Compilation Manager' 
CM von SML/NJ daraus einen Parser mit semantischer Auswertung.

Benutzung: 

Ins Verzeichnis NL gehen, dort SML/NJ aufrufen, und darin mit dem 
'Compilation Manager' CM von SML/NJ aus den .cm-Dateien das Programm 
bersetzen: 

Beispielsitzung:

> cd NL 
> /usr/bin/sml
Standard ML of New Jersey v110.45 [FLINT v1.5], February 13, 2004
- CM.make "qnl.110.42.cm";
[autoloading]
[library $smlnj/cm/cm.cm is stable]
[library $smlnj/internal/cm-sig-lib.cm is stable]
[library $/pgraph.cm is stable]
[library $smlnj/internal/srcpath-lib.cm is stable]
[autoloading done]
[scanning qnl.cm]
[library $/ml-yacc-lib.cm is stable]
[parsing (qnl.cm):qnl.sml]
[/usr/local/smlnj/bin/ml-lex qnl.lex]

Number of states = 86
Number of distinct rows = 60
Approx. memory size of trans. table = 15360 bytes
[parsing (qnl.cm):qnl.lex.sml]
[/usr/local/smlnj/bin/ml-yacc qnl.grm]
[parsing (qnl.cm):qnl.grm.sig]
[parsing (qnl.cm):qnl.grm.sml]
[loading (qnl.cm):nl.sml]
[compiling (qnl.cm):qnl.sml]
[code: 1976, env: 2705 bytes]
[loading (qnl.cm):nl.interface.sml]
[compiling (qnl.cm):qnl.grm.sig]
[code: 56, env: 765 bytes]
[compiling (qnl.cm):qnl.grm.sml]
[code: 28014, data: 1514, env: 1547 bytes]
[compiling (qnl.cm):qnl.lex.sml]
[code: 35477, data: 17589, env: 933 bytes]
[compiling (qnl.cm):nl.link.sml]
[code: 7245, data: 173, env: 4704 bytes]
[New bindings added.]
val it = true : bool

- NL.parse();
ein Student kennt Anna.
Value is: true
der Student ist Emil.
Value is: false
Anna.
Value is: a       
die Frau.
Value is: a       

^D  (Abbrechen)

Nachdem die Programme einmal bersetzt sind, werden sie nur noch geladen:

- CM.make "qnl.cm";
[scanning qnl.cm]
[library $/ml-yacc-lib.cm is stable]
[loading (qnl.cm):nl.sml]
[loading (qnl.cm):qnl.sml]
[loading (qnl.cm):nl.interface.sml]
[loading (qnl.cm):qnl.grm.sig]
[loading (qnl.cm):qnl.grm.sml]
[loading (qnl.cm):qnl.lex.sml]
[loading (qnl.cm):nl.link.sml]
[New bindings added.]
val it = true : bool

- NL.parse();
jeder Mann liebt Anna.
Value is: false

^D

Nachtrag fr Rechner an der LMU:
-------------------------------
Auf den Rechnern der LMU/Informatik ist unter /usr/bin/sml die 
letzte 'Release'-Version, SML/NJ version 110.0.3, installiert.

Die Version 110.42 ist auch installiert, aber unter 

     /usr/bin/sml-110.0.42 

Sie verwendet anscheinend Bibliotheksdatein der Version 110.0.3, 
weshalb man in qnl.110.42.cm die Zeile nl.link.sml durch 
nl.link.110.0.3.sml ersetzen muss.

Die Funktion 'reader' aus nl.link.sml ist in nl.link.110.0.3.sml:

      fun reader (n:int) = TextIO.inputLine TextIO.stdIn 

Vgl. auch die Merkbltter zur Veranstaltung 'Semantik' im SS 2004 
am CIS der Universitt Mnchen.                   H.Lei, 11.6.04

