2009-04-17 25 views
5

cách chính xác để giải quyết vấn đề này trong ANTLR là gì:Làm thế nào để đối phó với giá trị danh sách trở lại trong ANTLR

tôi có một quy tắc ngữ pháp đơn giản, nói cho một danh sách với một số tùy ý của các yếu tố.

list 
: '[]' 
| '[' value (COMMA value)* ']' 

Nếu tôi muốn gán giá trị trả lại cho danh sách và có giá trị đó là danh sách giá trị trả về thực tế từ quá trình sản xuất, cách thích hợp để thực hiện điều đó là gì? Các phương án Tôi đang giải trí bao gồm:

  • tạo ngăn xếp của riêng tôi trong phạm vi toàn cầu để theo dõi các danh sách này
  • Cố gắng kiểm tra các nút cây bên dưới tôi và trích xuất thông tin như vậy
  • Tiếp cận nó trong một số cách trơn tru và thú vị mà tôi hy vọng tìm hiểu về việc tôi có thể dễ dàng truy cập vào danh sách như vậy từ bên trong hành động liên quan đến quy tắc.

Tôi đoán câu hỏi là: Làm thế nào để những đứa trẻ tuyệt vời làm điều đó?

(FYI Tôi đang sử dụng API python cho ANTLR, nhưng nếu bạn đánh tôi với một ngôn ngữ khác, tôi có thể xử lý đó)

Trả lời

5

Trong C# nó có thể trông như thế này:

list returns [ List<string> ValueList ] 
    @init 
    { 
     $ValueList = new List<string>(); 
    } 
    : '[]' 
    | '[' value {$ValueList.Add(value);} (COMMA value {$ValueList.Add(value);})* ']' 
    ; 
+1

Và điều đó cũng rất gần với giao diện của nó trong Java. Cảm ơn! Tuy nhiên, Antlr yêu cầu tôi chỉ định tên cho mỗi "giá trị": a = expr {$ valueList.add ($ a.value);} (b = expr {$ valueList.add ($ b.value);}) * –

1

tôi đoán một cách đơn giản hơn có thể là

list returns [ List values ] 
: '[]' 
| '[' vs+=value (COMMA vs+=value)* ']' { 
     $values = $vs; 
} 
+0

"Định nghĩa ANTLR tham chiếu" của tác giả cho thấy mô hình này ở một số nơi - nhưng những gì tôi thấy nó cho tôi là một danh sách các subtrees AST, không phải là một danh sách các giá trị của chúng. –