2009-09-20 10 views
5

Ưu tiên vận hành được thực hiện trong ANTLR như thế nào?Ưu tiên nhà điều hành ANTLR

Tôi đang sử dụng gói XText/Antlr tại thời điểm này.

Edit:

Tôi đã làm những gì sepp2k gợi ý, và khai thác được ưu tiên làm việc bây giờ, nhưng những thứ như 3 + * cũng làm việc bây giờ. Các nhà khai thác về cơ bản là "rơi qua" cây.

Ngoài ra, tôi đã thử ngữ pháp C trên trang web của ANTLR và điều tương tự cũng xảy ra trong ANTLRworks.

Bất kỳ ai biết vấn đề là gì?

BinaryExpression: 
    'or'? AndOp; //or op 

AndOp: 
    'and'? ComparisonOp; 

ComparisonOp: 
    ('>'|'<'|'>='|'<='|'=='|'~=')? ConcatOp; 

ConcatOp: 
    '..'? AddSubOp; 

AddSubOp: 
    ('+' | '-')? MultDivOp; 

MultDivOp: 
    ('*' | '/')? ExpOp; 

ExpOp: 
    '^'? expr=Expression; 
+0

Cuộc gọi đến Biểu thức có thể là giữa '(' và ')'. Ngoài ra tất cả các nhà khai thác của bạn dường như thiếu một toán hạng bên trái. – sepp2k

+0

Tôi đã sửa nó bằng cách sử dụng phương thức được tìm thấy trong bình luận của tôi. Ngoài ra, toán hạng bên trái đã được di chuyển đến biểu thức thứ nhất để ngăn chặn đệ quy trái. – jameszhao00

Trả lời

9

Với ANTLR bạn mã hóa quyền ưu tiên trong quy tắc ngữ pháp. Giống như:

expr: mult ('+' mult)* ; 
mult: atom ('*' atom)* ; 
atom: INT | '(' expr ')' ; 

này sẽ phân tích "1 + 2 * 3 + (4 * 5 + 6)" là "(1 + (2 * 3)) + ((4 * 5) + 6)"

+0

Vui lòng đọc bản cập nhật của tôi :) – jameszhao00

+0

Có lẽ tôi có thể làm những thứ như AndOp: ('và' Expression) | So sánhOp – jameszhao00

+0

Để làm rõ quy tắc ngữ pháp chi tiết hơn sẽ khớp với mức độ ưu tiên cao hơn. Trong ví dụ trên "expr -> multi -> atom *" chi tiết hơn thì đường dẫn đến dấu cộng. Do đó đường dẫn * được ưu tiên. –

2

Vì bạn sử dụng Xtext, tôi khuyên bạn nên sử dụng khái niệm hành động của Xtext. Nghĩa là, một ngữ pháp biểu hiện đơn giản thường sẽ trông giống như thế này:

Sum: Product ({Sum.left=current} operator=('+'|'-') right=Product)*; 
Product: Atom ({Product.left=current} operator=('+'|'-') right=Atom)*; 
Atom: Number | Paren; 
Paren: '(' Sum ')'; 
Number: value=INT; 

hãy có một cái nhìn tại các tài liệu để biết chi tiết.