Tôi đang cố gắng để viết một hàm Chuỗi thẩm định ví dụ:chức năng đánh giá Viết Chuỗi
evaluate("4 + 1") ; // returns 5
evaluate("4 + 1 + 3") ; // returns 8
evaluate("4 + 1 * 3") ; // returns 7 (not 15)
The operators are + -/and *
My ban đầu mặc dù đã sử dụng biểu thức thông thường để thu thập các nhà khai thác và chữ số vì chúng có thể được xuất hiện. Và hơn sau khi tìm thấy thông tin đó, bằng cách nào đó, hãy tìm ra cách ưu tiên các nhà điều hành /*
ove -+
.
Dưới đây là cách tôi bắt đầu:
static String regex = "([\\+\\*-/])+";
static String digitRegex = "(\\d)+";
public static void main(String[] args) {
System.out.println(getOperators("4 + 1 * 3"));
}
public static List<String> getOperators(String input) {
Pattern p = Pattern.compile(regex);
Matcher matcher = p.matcher(input);
List<String> operatorList = new ArrayList<String>();
int count = 0;
while (matcher.find()){
if (matcher.group(count) != null && matcher.group(count).trim().length() > 0) {
operatorList.add(matcher.group(count));
count++;
}
}
return operatorList;
}
Bây giờ tôi có thể viết một phương pháp để trích xuất các chữ số bằng cách sử dụng cùng một logic.
public static List<Integer> getDigits(String input) {
Pattern p = Pattern.compile(digitRegex);
Matcher matcher = p.matcher(input);
List<Integer> digitList = new ArrayList<Integer>();
int count = 0;
while (matcher.find()) {
if (matcher.group(count) != null && matcher.group(count).trim().length() > 0) {
digitList.add(Integer.valueOf(matcher.group(count)));
count++;
}
}
return digitList;
}
Bây giờ là phần tôi bị kẹt. # 1 Phương pháp trên không thành công trên ví dụ thứ ba:
evaluate("4 + 1 * 3") ; // returns 7 (not 15)
Và # 2 Ngay cả khi tôi thử các ví dụ trước, tôi không thể hiểu được cách đặt đúng thứ tự.
Tôi có đi đúng hướng không, có ai có lời khuyên hữu ích nào vui lòng chia sẻ không?
Đây là [toán tử ưu tiên] (http: // en.wikipedia.org/wiki/Order_of_operations). Trong trình phân tích cú pháp gốc đệ quy, bạn chỉ xuất phát từ các toán tử ưu tiên thấp hơn đến các precedences cao hơn, và sử dụng toán tử parenthetical để nhảy trở lại đỉnh. –
Tôi hy vọng điều này sẽ giúp: http://en.wikipedia.org/wiki/Recursive_descent_parser – sarnold
biểu thức 'assessment (" 4 + 1 * 3 ");' NÊN trả lại 7.nếu bạn muốn nó trả lại 15, bạn nên viết 'assessment ("(4 + 1) * 3"); ' – alfasin