Frage

Also hier ist, was ich suche zu erreichen. Ich mag meinen Benutzern einen einzigen Google-ähnlichen Text geben, wo sie ihre Fragen eingeben können. Und ich mochte sie in der Lage sein, semi-natürliche Sprache auszudrücken wie

"view all between 1/1/2008 and 1/2/2008"

Es ist in Ordnung, wenn die Syntax recht strukturiert und begrenzt auf diese spezielle Domäne sein muss ... das sind erfahrene Benutzer, die diese verwenden werden.

Letztlich glaube ich, die Parse-Ergebnisse als eine Art Ausdrucksbaum zur Verfügung stehen möge. Aber wenn Sie einige andere Ideen haben, was Datenstruktur könnte besser sein.

Dies ist in C #: -)

War es hilfreich?

Lösung

Sie beschreiben eine Programmiersprache. Zugegeben, es ist eine kleine Sprache (oft eine wenig Sprache oder Domain Specific Language (DSL) genannt). Wenn Sie noch nie den Begriff Rekursiver Abstieg gehörten, sind Sie wahrscheinlich besser beraten folgender Paulus und mit Drop-Down-Box von einer Beschreibung.

Aber auch hier, hätte ich ihm zustimmen, dass, wenn Sie es tun wollen, Antlr ist der Weg zu gehen. Es gibt Tutorials auf der Website, die Sie beginnen könnte helfen. Grundsätzlich müssen Sie beschreiben, wie die Syntax Backus-Naur Form Notation.

Sie werden dann Antlr über Ihre grammer laufen, und es wird Ihren Parser generieren. Anschließend können Sie füttern die Eingabe von Ihrem Lehrbuch in einem Abstract Syntax-Baum. Sie können dann diesen Baum benutzen, um Ihre Abfrage zu generieren. Es ist nicht so schwierig, wie es alle Töne, aber es ist ein bisschen zu.

Wenn Sie wirklich in diesen sind und / oder wollen Ihre Programmierung Flügel ein wenig strecken, können Sie mehr über das Thema mit dem Drachen Buch, AKA Compiler lesen. Prinzipien, Techniken und Werkzeugen

Viel Glück mein Freund.

Andere Tipps

Für eine sehr einfache Sprache, würde ich mit regexps gehen. Hauptvorteil ist, Sie müssen nicht mit einer Code-Generierung beschäftigen. Debuggen des Mustervergleich ist im Wesentlichen gleich Null, aber.

Wenn Sie Ihre Sprache mäßig komplex ist (Sie würden die ganze Sache in einer einzigen Grammatikdatei spezifiziert nichts dagegen), würde ich gehen mit Coco / R -. es ist schnell, einfach zu bedienen und macht extrem debug Code

Für eine komplexere Sprache, mein derzeitiger Favorit ist Antlr v3 . Unterstützt Multi-File-Grammatiken (über die ‚Einfuhr‘ statement), was sehr schön ist. Der generierte Code ist debug, aber dauert ein wenig gewöhnungsbedürftig, bevor das Debuggen könnte in Betracht gezogen werden ‚einfach.‘

Ich habe vor in dieser Situation gewesen. Nach vielen Diskussionen haben wir beschlossen, dass kontextsensitive Dropdown-Listen eine bessere Lösung als nur eine Textbox waren.

Zum Beispiel hat 4-Dropdown-Listen, aber die letzten 3 sind deaktiviert. Dann, wenn der Benutzer eine Option aus dem ersten auswählt, füllt sie und ermöglicht es die andere. So würden sie wählen „Alle“ und dann „zwischen“, und dann vielleicht ein Textfeld oder einen Kalender für die letzten beiden Pop.

Hier ist ein Beispiel, das wie Art ist, was ich rede

Ein Ausdruck Baum ist eine gute Idee. Es gibt viele gute allgemeine Parser und Parser-Generatoren gibt, Open-Source als auch kommerzielle, die richtige Abfrage-Strings in Ausdrucksbäume verwandeln kann.

Verwenden Sie Oslo , speziell speziell für diese ...

Ich weiß nicht, ob dies wird Ihnen helfen, aber was wir taten, war: Wir gaben der Benutzer vordefinierte Kriterien wie für aktuelle Auswahl haben wir ihnen zwei Kalender-Pop-ups, so dass sie von und nach Datumsbereich auswählen können .. es obligatorisch machen. wir .. nicht so Verwendung Datumsfilter nur anzuwenden, wenn der Benutzer die Daten gibt ... in ähnlicher Weise können Sie auch den Benutzern eine vordefinierte Auswahlkriterien geben ... andere dann, dass Ausdrucksbaum scheint ein nett zu sein Abhilfe für die.

Der GOLD Parser Generator eine hilfreiche UI hat für die Gestaltung und Ihre Grammatik testen, einigermaßen gute Tutorials und Dokumentation, und ist leicht von C # zu verwenden.

das Zeug zu analysieren versuchen, wäre eine Katastrophe, und ultimatley für den Benutzer sehr zu beschränken, damit sie mehr frustrierend dann ihnen zu helfen. Ich würde vorschlagen, vordefinierte Abfrage clasues Verwendung mit irgendeiner Art von Query Builder-Tool, das alle verfügbaren Optionen in Drop-Down-Form hat. Sie können verschiedene Boolesche Operatoren für verschiedene Datentypen haben (größer als, kleiner als für numerische, wie nicht für Strings etc mögen), aber ich denke, dass ein verdammt viel mehr Sinn, als tatsächlich versuchen zu analysieren, machen würde, welche Art kann ein Benutzer.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top