Ich lege einen Lexer/Parser für eine einfache Programmiersprache mit einem Prolog DCG, die die Liste der Token/Syntax-Struktur mit DCG-Argumente, z.Get Prolog DCG Argumente generiert aus Satz wird geparst
symbol(semicolon) --> ";".
symbol(if) --> "if".
und dann wird der Syntaxbaum mit diesen Argumenten zu den DCG-Regeln erstellt.
Allerdings habe ich eine Beule darin, dass, wenn es zu Parsing Variablen und Zahlen (nur ganze Zahlen in dieser Sprache), ich brauche die DCG Argumente zu dynamischen, z.
symbol(number(X)) --> X, {integer(N)}.
Im Wesentlichen muss ich das DCG-Argument im Wesentlichen aus dem generiert werden, was es tatsächlich analysiert. Gibt es eine Möglichkeit, dies zu tun? Wenn nicht, was könnte ein guter Workaround sein?
EDIT: Als konkretes Beispiel habe ich die Regel bekommt
symbol(num(N)) --> {number_codes(N,C)}, C.
und ich brauche die Ausgabe N=7
bei der Abfrage phrase(symbol(num(N)),"7").
Es ist definitiv möglich; Hast du [dcg/basics] (http://www.swi-prolog.org/pldoc/doc/_SWI_/library/dcg/basics.pl) gesehen? (Auch der Quellcode dafür [ist ziemlich lehrreich] (http://www.swi-prolog.org/pldoc/doc/_SWI_/library/dcg/basics.pl?show=src#integer/3).) –
Sie sind in der Nähe. 'Symbol (Zahl (X)) -> [X], {Ganzzahl (X)}.' Obwohl Sie vorsichtig sein wollen, da 'Zahl/1' ein Standard-Prolog-Prädikat ist. Vielleicht wähle etwas anderes. – lurker
Ich bin mir aber nicht so sicher; Das spezifische Beispiel, dem ich momentan gegenüberstehe, ist: 'Symbol (num (N)) -> {Zahl_Codes (N, C)}, C'. Ich brauche im Wesentlichen den Ausgang 'N = 7' bei der Eingabe von' Phrase (Symbol (num (N)), "7"). – user2396812