2009-12-16 32 views
5

Hey. Tôi mới dùng ANTLR. ANTLRWorks thuật sĩ wrrited cho tôi đoạn mã sau:ANTLR "kết thúc không mong muốn của subtree"

grammar test; 

ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* 
    ; 

INT : '0'..'9'+ 
    ; 

FLOAT 
    : ('0'..'9')+ '.' ('0'..'9')* EXPONENT? 
    | '.' ('0'..'9')+ EXPONENT? 
    | ('0'..'9')+ EXPONENT 
    ; 

COMMENT 
    : '//' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;} 
    | '/*' (options {greedy=false;} : .)* '*/' {$channel=HIDDEN;} 
    ; 

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

STRING 
    : '"' (ESC_SEQ | ~('\\'|'"'))* '"' 
    ; 
CHAR: '\'' (ESC_SEQ | ~('\''|'\\')) '\'' 
    ; 

fragment 
EXPONENT : ('e'|'E') ('+'|'-')? ('0'..'9')+ ; 

fragment 
HEX_DIGIT : ('0'..'9'|'a'..'f'|'A'..'F') ; 

fragment 
ESC_SEQ 
    : '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\') 
    | UNICODE_ESC 
    | OCTAL_ESC 
    ; 

fragment 
OCTAL_ESC 
    : '\\' ('0'..'3') ('0'..'7') ('0'..'7') 
    | '\\' ('0'..'7') ('0'..'7') 
    | '\\' ('0'..'7') 
    ; 

fragment 
UNICODE_ESC 
    : '\\' 'u' HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT 
    ; 

Khi gỡ lỗi nó, nó ném các lỗi sau:

[22:45:49] error(100): C:\Documents and Settings\user\Desktop\test.g:0:0: syntax error: codegen: <AST>:0:0: unexpected end of subtree 

Ai đó có thể giải thích cho tôi lỗi này là gì, ở đâu là nó và làm thế nào tôi có thể sửa chữa nó?

Cảm ơn.

Trả lời

7

Trong ANTLR, mọi quy tắc bắt đầu bằng chữ hoa là quy tắc lexer. Những cái bắt đầu bằng chữ thường là các quy tắc phân tích cú pháp. Như bạn thấy, bạn chỉ có quy tắc lexer: và có vấn đề của bạn. Bạn phải có ít nhất một quy tắc phân tích cú pháp. Nếu bạn thêm quy tắc sau:

parse 
    : ID 
    | INT 
    | // ... 
    ; 

lỗi sẽ biến mất khi tạo tệp nguồn cho từ khóa/trình phân tích cú pháp của bạn.

2

Tuyên bố từ chối trách nhiệm: Tôi không biết gì về thuật sĩ ANTLR.

Một tìm kiếm google lượt lên câu nói này:

Usually "unexpected end of subtree" means you forgot to make something a root in the parser.

Điều này làm cho ý nghĩa với tôi NẾU tập tin của bạn có nghĩa vụ phải chỉ định một ngữ pháp và không chỉ quy tắc để phân tích từ vựng. Dòng đầu tiên của tệp của bạn là "kiểm tra ngữ pháp" vì vậy có lẽ đây là ngữ pháp.

Ngữ pháp cho phép bạn giảm một loạt ký hiệu đầu cuối thành một ký hiệu nonterminal duy nhất. Vì vậy, ví dụ, một ngữ pháp rất đơn giản đại diện cho biểu thức ngoặc đầy đủ sẽ trông như thế này:

P : E 
E : (X) 
    | E E 
    | (E) 
X : 'x' 

Ở đây, P là gốc rễ bởi vì tất cả câu cuối cùng giảm đến một P. Nếu một câu không thể giảm đến một P, nó không khớp với ngữ pháp này. Vì vậy, bạn cần phải tìm một gốc cho ngữ pháp của bạn, và tất cả các sản phẩm khác sẽ chỉ xuất hiện trong bối cảnh gốc (tức là thông qua một đạo hàm trực tiếp hoặc gián tiếp).

+0

Lưu ý rằng vì ANTLR tạo các trình phân tích cú pháp LL (*), nó không thể đối phó với ngữ pháp đệ quy trái mà bạn đã đăng. http://www.antlr.org/wiki/display/ANTLR3/Left-Recursion+Removal –

+0

Ah, ok - với ANTLR kết thúc bằng "LR" tôi chỉ giả định. – danben

+0

:) đúng, tên đề xuất khác. ANTLR là viết tắt của "ANother Tool cho ** L ** anguage ** R ** ecognition". –

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