2009-12-16 19 views
5

अरे। मैं एएनटीएलआर के लिए नया हूँ। ANTLRWorks जादूगर मेरे लिए wrrited निम्नलिखित कोड:एएनटीएलआर "उपट्री का अप्रत्याशित अंत"

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 
    ; 

जब यह डिबगिंग, यह निम्न त्रुटि फेंकता है:

[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 

कोई मुझे बता सकते हैं, त्रुटि है क्या कि वह कहाँ है और मैं कैसे ठीक कर सकते हैं यह?

धन्यवाद।

उत्तर

7

एएनटीएलआर में, प्रत्येक नियम जो अपरकेस से शुरू होता है वह एक लेक्सर नियम है। जो लोग कम मामले के साथ शुरू करते हैं वे पार्सर नियम हैं। जैसा कि आप देख सकते हैं, आपके पास केवल लेज़र नियम हैं: और आपकी समस्या है। आपके पास कम से कम एक पार्सर नियम होना चाहिए। यदि आप निम्न नियम जोड़ते हैं:

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

आपके लेक्सर/पार्सर के लिए स्रोत फ़ाइलों को उत्पन्न करते समय त्रुटि गायब हो जाएगी।

2

अस्वीकरण: मुझे एएनटीएलआर विज़ार्ड के बारे में कुछ भी पता नहीं है।

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

यह यदि आपकी फ़ाइल एक व्याकरण और शाब्दिक विश्लेषण के लिए बस नहीं नियमों को निर्दिष्ट करने के लिए माना जाता है मेरे लिए समझ में आता है:

एक गूगल खोज इस उद्धरण के ऊपर हो जाता है। आपकी फ़ाइल की पहली पंक्ति "व्याकरण परीक्षण" है इसलिए संभवतः यह एक व्याकरण है।

एक व्याकरण आपको एक गैर-टर्मिनल प्रतीक में टर्मिनल प्रतीकों की एक श्रृंखला को कम करने देता है। उदाहरण के लिए, एक बहुत ही सरल व्याकरण पूरी तरह से parenthesized भाव का प्रतिनिधित्व इस प्रकार दिखाई देगा:

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

यहाँ, पी जड़ है क्योंकि सभी वाक्य अंततः एक पी को कम एक वाक्य एक पी को कम नहीं कर सकते तो है, यह करता है इस व्याकरण से मेल नहीं खाते। इसलिए, आपको अपने व्याकरण के लिए जड़ ढूंढनी होगी, और अन्य सभी प्रोडक्शंस केवल रूट के संदर्भ में आना चाहिए (यानी प्रत्यक्ष या अप्रत्यक्ष व्युत्पन्न के माध्यम से)।

+0

ध्यान दें कि चूंकि एएनटीएलआर एलएल (*) पार्सर्स का उत्पादन करता है, इसलिए यह आपके द्वारा पोस्ट किए गए बाएं-रिकर्सिव व्याकरण से निपट नहीं सकता है। http://www.antlr.org/wiki/display/ANTLR3/Left-Recursion+Removal –

+0

आह, ठीक है - "एलआर" में समाप्त होने वाले एएनटीएलआर के साथ मैंने अभी माना है। – danben

+0

:) सच है, नाम अन्यथा सुझाता है। एएनटीएलआर का मतलब है "** एल ** एंज्यूज ** आर ** मान्यता" के लिए एक और उपकरण। –

संबंधित मुद्दे