Ngữ pháp này được để lại đệ quy:
Expression ::= AdditionExpression
AdditionExpression ::=
MultiplicationExpression
| AdditionExpression '+' MultiplicationExpression
| AdditionExpression '-' MultiplicationExpression
MultiplicationExpression ::=
Term
| MultiplicationExpression '*' Term
| MultiplicationExpression '/' Term
Term ::=
Number
| '(' AdditionExpression ')'
Number ::=
[+-]?[0-9]+(\.[0-9]+)?
Vì vậy, trên lý thuyết, dòng dõi đệ quy sẽ không hoạt động. Nhưng bằng cách khai thác các thuộc tính của ngữ pháp mà mỗi quy tắc đệ quy trái tương ứng với một mức độ ưu tiên cụ thể và giao diện của một mã thông báo duy nhất là đủ để chọn sản xuất chính xác, các quy tắc đệ quy trái có thể được phân tách riêng lẻ trong khi các vòng lặp.
Ví dụ, để phân tích cú pháp không đầu cuối AdditionExpression, mã giả này đủ:
function parse_addition_expression() {
num = parse_multiplication_expression()
while (has_token()) {
get_token()
if (current_token == PLUS)
num += parse_multiplication_expression()
else if (current_token == MINUS)
num -= parse_multiplication_expression()
else {
unget_token()
return num
}
}
return num
}
Tên chính xác cho loại trình phân tích cú pháp này là gì? Bài viết thông tin này chỉ đề cập đến nó như là "Giải pháp cổ điển": https://www.engr.mun.ca/~theo/Misc/Ex_parsing.htmlm
Phải có một tên thích hợp cho loại trình phân tích cú pháp này.