2013-05-15 5 views
9

Tôi muốn để có thể phân tích cú pháp biểu thức đại diện cho đại lượng vật lý nhưđơn giản vật lý đo lường số lượng đơn vị phân tích cú pháp cho Java

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

và vân vân. Theo cách đơn giản nhất có thể. Có thể làm như vậy bằng cách sử dụng một cái gì đó như Pyparsing (nếu một điều như vậy tồn tại cho Java), hoặc tôi nên sử dụng các công cụ phức tạp hơn như Java CUP?

EDIT: Để trả lời câu hỏi của MrD, mục tiêu là thực hiện chuyển đổi giữa các đại lượng, ví dụ: chuyển đổi g thành kg (đơn giản ...) hoặc có thể ° F/(kg * s^2) đến K/(lb * h^2) giả sử h là bốn giờ và lb cho pound

+0

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

+0

Bạn có thể muốn xem xét nỗ lực khá cũ để diễn giải các đại lượng vật lý, [Bộ công cụ UCUM được gắn trên Pixel] (http: //www.dclunie. com/pixelmed/software/UCUM /). Bộ công cụ sử dụng ANTLR. Hãy xem Javadoc để biết thêm chi tiết. Tôi không thể nói bất cứ điều gì về mức độ hoàn chỉnh của nó, mặc dù. –

+0

Mục đích chính xác của bạn là gì? Làm thế nào để bạn có nghĩa là "phân tích cú pháp"? Bạn có nghĩa là nó nên giải thích một cái gì đó như ** 10m/s + 2m/s ** và đánh giá nó đến ** 12m/s ** hoặc có lẽ một cái gì đó như ** m/s * kg * s ** và đánh giá * * m * kg **? Mặc dù đôi khi nó có thể không âm thanh nhiều, làm sáng tỏ mục tiêu của bạn có thể giúp bạn đạt được điều đó! – MrD

Trả lời

6

Điều này khó hơn. (Tôi đã thực hiện một số lượng công việc hợp lý ở đây). Vấn đề chính là không có tiêu chuẩn (tôi đã làm việc với NIST trên các đơn vị và mặc dù cuối cùng họ đã tạo ra một ngôn ngữ đánh dấu mà ít người sử dụng nó). Vì vậy, nó thực sự là một hình thức xử lý ngôn ngữ tự nhiên và có để đối phó với:

  • nhập nhằng (những gì hiện "M" có nghĩa là - mét hoặc mega)
  • dấu chấm câu không phù hợp
  • chữ viết tắt
  • biểu tượng (ví dụ: " mu" cho vi)
  • ngữ nghĩa không rõ ràng (ví dụ như là kg/m/s giống như kg/(m * s)?

Nếu bạn chỉ việc tạo ra một hệ thống đồ chơi thì bạn nên tạo một BNF cho hệ thống và đảm bảo rằng tất cả các ví dụ đều tuân theo nó. Điều này sẽ sử dụng dấu câu thông thường ("/", "", "(", ")", "^"). Các trường ký tự có thể có độ dài thay đổi ("m", "kg", "lb"). Đại số trên các chuỗi này ("kg" -> 1000 "g" có vấn đề là kg là đơn vị cơ bản.

Nếu bạn thực hiện nghiêm túc thì ANTLR (@Yaugen) hữu ích, nhưng lưu ý rằng các đơn vị trong hoang dã sẽ không theo một ngữ pháp thông thường do sự mâu thuẫn trên.

Nếu bạn đang thực sự nghiêm trọng (tức là chuẩn bị để đưa vào một tháng rắn), tôi muốn được quan tâm để biết. :-)

My hiện tại cách tiếp cận (nằm ngoài phạm vi câu hỏi của bạn) là thu thập một số lượng lớn các ví dụ từ các tài liệu tự động và tạo ra một số chẩn đoán.

+0

Ngoài ra có chữ viết tắt "cục bộ" và đơn vị không chuẩn khác sửa đổi như 10 g = 1 dag (theo SI) = 1 dkg (thường) Xem [tiền tố SI trong Wikipedia] (http://en.wikipedia.org/wiki/Metric_prefix) – gaborsch

+0

M là cho mega và m cho mét, nhưng vẫn còn một số người không thể biết/chú ý đến điều này. Một trường hợp khác là F, có phải là Farad hay Fahrenheit? (Ký hiệu đúng cho Fahrenheit là ° F, nhưng vẫn ...). Dù sao kể từ khi nó sẽ được chèn vào trong một số phần mềm, tôi sẽ giả sử người dùng sẽ thực hiện một chút nỗ lực và tránh các ký hiệu kỳ quái hoặc đơn giản là sai – Paolo

+0

@Paolo Đồng ý! Ngữ cảnh ngôn ngữ giúp ("chúng tôi làm nóng nó đến 100F" có thể được phân tích cú pháp để giải quyết nó. Nhưng nó đòi hỏi một trình phân tích cú pháp (ví dụ: http: // http: //chemicaltagger.ch.cam.ac.uk/) cung cấp số này –