2013-05-15 12 views
9

Ich möchte in der Lage sein, Ausdrücke wieEinfache physikalische Größe Maßeinheit Parser für Java

g/l 
m/s^2 
m/s/kg 
m/(s*kg) 
kg*m*s 
°F/(lb*s^2) 

repräsentieren physikalische Größen zu analysieren und so weiter. Auf die einfachste Weise möglich. Ist es möglich, so etwas wie Pyparsing zu verwenden (wenn so etwas für Java existiert), oder sollte ich komplexere Tools wie Java CUP verwenden?

EDIT: Um MrD's Frage zu beantworten, ist das Ziel eine Umwandlung zwischen Mengen, also zum Beispiel konvertieren g in kg (dieser ist einfach ...), oder vielleicht ° F/(kg * s^2) bis K/(lb * h^2) angenommen, h ist vier Stunden und lb für Pfund

+0

ANTLR? http://www.antlr.org/wiki/display/ANTLR4/Home –

+0

Vielleicht möchten Sie sich einen ziemlich alten Versuch ansehen, physikalische Größen zu interpretieren, das [Pixelmed UCUM Toolkit] (http://www.dclunie.org). com/pixelmed/software/UCUM /). Das Toolkit verwendet ANTLR. Werfen Sie einen Blick auf den Javadoc für weitere Details. Zu der Vollständigkeit kann ich jedoch nichts sagen. –

+0

Was genau ist dein Ziel hier? Wie meinst du "Parsing"? Meinst du es sollte etwas wie ** 10m/s + 2m/s ** interpretieren und es auf ** 12m/s ** oder vielleicht etwas wie ** m/s * kg * s ** auswerten und zu * auswerten * m * kg **? Auch wenn es manchmal nicht viel klingt, kann es Ihnen helfen, Ihr Ziel zu klären! – MrD

Antwort

6

Das ist härter als es aussieht. (Ich habe hier eine Menge Arbeit geleistet). Das Hauptproblem ist, dass es keinen Standard gibt (ich habe mit NIST an Einheiten gearbeitet, und obwohl sie schließlich eine Auszeichnungssprache erstellt haben, benutzen sie nur wenige). Es ist also wirklich eine Form der Verarbeitung natürlicher Sprache und hat zu behandeln:

  • Mehrdeutigkeit (was bedeutet „M“ bedeutet - Meter oder mega)
  • inkonsistent Interpunktion
  • Abkürzungen
  • Symbole (zB " mu“für micro)
  • unklar Semantik (zB ist kg/m/s die gleiche wie kg/(m * n)?

Wenn Sie gerade ein Spielsystem zu schaffen, dann sollten Sie Erstellen Sie eine BNF für das System und stellen Sie sicher, dass alle Beispiele daran festhalten. Dies verwendet gängige Interpunktionszeichen ("/", "", "(", ")", "^"). Zeichenfelder können unterschiedliche Länge haben ("m", "kg", "lb"). Algebra auf diesen Strings („kg“ -.> 1000 „g“ hat Probleme als kg eine Grundeinheit ist

Wenn Sie es tun ernst dann ANTLR (@Yaugen) ist nützlich, aber bewusst sein, dass die Einheiten in der Wild wird nicht eine regelmäßige Grammatik aufgrund der Unstimmigkeiten oben.

Wenn Sie wirklich ernst sind (dh bereit, in einem festen Monat setzen), ich interessiert wäre zu wissen. :-)

Mein aktueller Ansatz (der außerhalb des Umfangs Ihrer Frage liegt) besteht darin, eine große Anzahl von Beispielen aus der Literatur automatisch zu sammeln und eine Reihe von Heuristiken zu erstellen.

+0

Es gibt auch "lokale" Abkürzungen, und andere Nicht-Standard-Einheit ändert sich wie 10 g = 1 dag (von SI) = 1 dkg (gemeinsam) Siehe [SI Präfixe in Wikipedia] (http://en.wikipedia.org/wiki/Metric_prefix) – gaborsch

+0

M ist für Mega und M für Meter, aber trotzdem konnten manche Leute das nicht wissen/darauf achten. Ein weiterer Fall ist F, ist es Farad oder Fahrenheit? (Richtige Schreibweise für Fahrenheit ist ° F, aber immer noch ...). Wie auch immer, da es in irgendeine Software eingefügt wird, nehme ich an, dass der Benutzer sich etwas Mühe geben wird und bizarre oder einfach falsche Schreibweisen vermeidet. – Paolo

+0

@Paolo Einverstanden! Die sprachlichen Kontext hilft („wir es 100F erhitzt“, es zu lösen analysiert werden können, aber es erfordert einen Parser (zB http:. // http: //chemicaltagger.ch.cam.ac.uk/), das bietet dieses –