2010-10-25 32 views
7

Tôi đang sử dụng ANTLR (3.2) để phân tích cú pháp một số ngữ pháp khá đơn giản. Thật không may, tôi đã gặp một vấn đề nhỏ. Thực hiện quy tắc follwoing:ANTLR: các toán tử đơn giản và nhị phân khác nhau (ví dụ: dấu trừ)

exp 
: NUM 
| '(' expression OPERATOR expression ')' -> expression+ 
| '(' (MINUS | '!') expression ')' -> expression 
; 

OPERATOR có cùng dấu trừ ('-') như được xác định bằng MINUS. Bây giờ ANTLR dường như không thể đối phó với hai quy tắc này. Nếu tôi loại bỏ một trong hai, tất cả mọi thứ hoạt động tốt.

Bất kỳ ý tưởng nào?

Trả lời

9

Làm cho biểu thức đơn nhất là biểu tượng có mức độ ưu tiên cao nhất. Tôi cũng sẽ sử dụng một mã thông báo khác nhau cho số - đơn nhất để phân biệt giữa dấu trừ tốt hơn. Một bản demo:

grammar Exp; 

options { 
    output=AST; 
} 

tokens { 
    UNARY; 
} 

parse 
    : exp EOF 
    ; 

exp 
    : additionExp 
    ; 

additionExp 
    : multiplyExp ('+'^ multiplyExp | '-'^ multiplyExp)* 
    ; 

multiplyExp 
    : unaryExp ('*'^ unaryExp | '/'^ unaryExp)* 
    ; 

unaryExp 
    : '-' atom -> ^(UNARY atom) 
    | '!' atom -> ^('!' atom) 
    | atom 
    ; 

atom 
    : '(' exp ')' -> exp 
    | Number  -> Number 
    ; 

Number : ('0'..'9')+ ('.' ('0'..'9')+)? ; 

Spaces : (' ' | '\t' | '\r'| '\n') {$channel=HIDDEN;} ; 

Một test nhanh với nguồn:

3 * -4 + 7/6 * -(3 + -7 * (4 + !2)) 

sản xuất AST sau:

alt text

+0

wow, công việc tuyệt vời, cảm ơn bạn rất nhiều! – Christian

+0

@Christian, bạn được chào đón. –

+0

Và làm thế nào là tokenizer phải biết khi đọc một trừ nếu nó tương ứng với một UNARY? –

Các vấn đề liên quan