2016-03-24 12 views
0

Wir schreiben einen Compiler in OCaml für unsere eigene domänenspezifische Sprache. Bis jetzt haben wir funktionierende Scanner, Parser und Ast.OCaml: Wie Scanner und Parser zu testen?

Was ist der beste Weg, um Scanner/Parser zu diesem Zeitpunkt zu testen? Ich weiß, dass es möglich ist, eine Sequenz von Token an den Parser/Scanner zu übergeben und festzustellen, ob sie vom Scanner/Parser akzeptiert/abgelehnt wird. (z. B. echo "FLOAT ID" | menhir --interpret --interpret-show-cst parser.mly).
Aber gibt es eine Möglichkeit, das tatsächlich in unserer eigenen Sprache geschriebene Programm an den Scanner/Parser zu übergeben und festzustellen, ob es akzeptiert wird?

Ich muss hinzufügen, dass ich sehr neu zu OCaml bin und ich sehr wenig über Compiler weiß.

+0

Können Sie Lexing.from_channel oder Lexing.from_string nicht verwenden? _val from_string: Zeichenfolge -> lexbuf Erstellen Sie einen Lexer-Puffer, der aus der angegebenen Zeichenfolge liest. Der Lesevorgang beginnt mit dem ersten Zeichen in der Zeichenfolge. Eine End-of-Input-Bedingung wird generiert, wenn das Ende der Zeichenfolge erreicht ist. – Lhooq

+0

Können Sie uns bitte ein Beispiel geben? – fomkatya

Antwort

2

Wenn das, was Sie tun, ist eine Zeichenfolge an Ihren Parser zu geben und sehen, ob es funktioniert, könnten Sie tun dies (unter der Annahme Ihr Ausgangspunkt im Parser ist prog)

main.ml : 
let() = 
    (* Taking the string given as a parameter or the program *) 
    let lb = Lexing.from_string Sys.argv.(1) in 
    (* if you want to parse a file you should write : 
     let ci = open_in filename in 
     let lb = Lexing.from_channel ci in 
    *) 
    try 
     let p = Parser.prog Lexer.token lb in 
     Printf.printf "OK\n" 
    with _ -> Printf.printf "Not OK\n" 

Habe ich Hilfe ? ;-)

+0

Ja, das ist sehr hilfreich. Vielen Dank. Es gibt mir eine Warnung, dass Variable "p" nirgends verwendet wird. – fomkatya

+0

Ja, das ist, weil ich nicht weiß, was Sie damit machen wollen. Wenn du in deinem Parser% start prog geschrieben hast, dann ist _p_ vom Typ _Ast.ast_ und du machst was immer du damit machen willst ;-) Wenn du es nicht benutzen willst, schreibe einfach _let _ = Parser. prog Lexer.token lb_ _ (Vergiss nicht, die Antwort zu erhöhen und zu akzeptieren ;-)) _ – Lhooq

+0

Was wird diese Variable halten? – fomkatya