2017-12-09 2 views
-1

Welchen Schritt muss ich machen, um ein solches Programm zu erstellen.Wie parse Quellcode in Englisch?

Ich möchte ein Programm haben, das ein einfaches (begrenztes) Java-Schlüsselwort in die englische menschliche Sprache aufnimmt.

zB

public class HelloWorld { 

public static void main(String[] args) { 
    int x; 
    int y; 
    System.out.println("Hello, World"); 
} 

} 

zu

Deklarieren Hello World Class
wichtigste Methode deklarieren
Deklarieren Variable x
Variable y
Drucken Deklarieren Sie das Wort "Hallo, Welt"
Schließen geschweifte Klammern
Schließen geschweifte Klammern

Das Programm liest den Quellcode Zeile für Zeile.

  • Ich versuchte cl-ppcre verwenden, aber das Problem ist, ich kann es nicht herausfinden, wie man ein Wort Temp zu nehmen.

    beispiels

    Declare HelloWord fügen Sie dann "Klasse" Wort.

    nichtDeclare class HelloWorld, aber ich will Declare Helloworld class

  • oder es schwierig ist, zu ersetzen ");" am Ende des Druckes. Weil ein anderes Wort ersetzt werden muss.

Ich habe versucht, Zeile für Zeile

(with-open-file (input "~/test.java") 
    (loop for line = (read-line input nil) 
     while line do (format t "~a~%" (parse-laporan line)))) 

zu lesen und es

(defun parse-laporan (isi) 
    (cond 
    ((cl-ppcre:scan "int " isi) 
    (cl-ppcre:regex-replace "int" isi "Declare variable")) 
    ((cl-ppcre:scan "System.out.print+" isi) 
    (cl-ppcre:regex-replace "System.out.print+" isi "print word ")) 
    ((cl-ppcre:scan "System.out.println+" isi) 
    (cl-ppcre:regex-replace "System.out.println+" isi "print word ")) 
    ((cl-ppcre:scan "(" isi) 
    (cl-ppcre:regex-replace "()" isi " ")) 
    ((cl-ppcre:scan "public class" isi) 
    (cl-ppcre:regex-replace "public class" isi "Declare Kelas ")))) 

analysieren, aber es funktioniert nicht gut.

Muss ich den gesamten Inhalt der Datei lesen und einen Abstract Syntax Tree erstellen? (wie ein Dolmetscher tut) oder kann ich es nur erreichen, indem ich Wort für Wort ersetze?

+0

sehr interessantes Projekt, [Lintj] (https://github.com/xach/linj) von António Menezes Leitão und es ist [Präsentation Folie] (https://github.com/xach/linj/blob/master/ doc/java-for-lispers.pdf) – azzamsa

+1

Was Sie in Ihrem Code tun, hat nichts mit 'Parsen' zu tun. Sie müssen lediglich ein Textmuster durch eine Zeichenfolge für jede Zeile ersetzen. –

+0

Ja, das stimmt. so dass ich in meinem Repo keinen "Parse" Namen gebe. Ich muss diese Idee aussetzen. Ich denke, ich kann es erreichen, indem ich hier und da nur das Wort "awk" oder "RegEx" vertausche. Aber als [Basile Starynkevitch] (https://Stackoverflow.com/a/47726100/6000005) sagte: "Dein Problem ist wahrscheinlich härter als das, was du dir vorstellst". Ich denke, es ist richtig. Ich werde auf diese Idee zurückkommen, nachdem ich PCL und PAIP beendet habe. – azzamsa

Antwort

0

Muss ich den gesamten Inhalt der Datei lesen und einen Abstract Syntax Tree erstellen?

Natürlich ja.

Und Sie wollen es wahrscheinlich nicht einfach ein Baum aber einige DAG sein.

Sie möchten vielleicht mehrere Darstellungen Ihres Quellcodes behalten. Vielleicht möchten Sie haben mehrere besteht.

PS.Ihr Problem ist wahrscheinlich schwieriger als das, was Sie sich vorstellen. Ich würde einige rule-based system Ansatz betrachten.

Verwandte Themen