2009-11-02 14 views
6

मैं एक ANTLR व्याकरण है कि इस तरह के रूप में चिह्नित वाक्य को पार्स करता है का निर्माण करने की कोशिश कर रहा हूँ "नियम गुंजाइश पर विशेषता पहुंच गुम":ANTLR: समस्या

DT The NP cat VB ate DT a NP rat 

व्याकरण और है:

fragment TOKEN : (('A'..'Z') | ('a'..'z'))+; 
fragment WS : (' ' | '\t')+; 
WSX : WS; 
DTTOK : ('DT' WS TOKEN); 
NPTOK : ('NP' WS TOKEN); 
nounPhrase: (DTTOK WSX NPTOK); 
chunker : nounPhrase {System.out.println("chunk found "+"("+$nounPhrase+")");}; 

व्याकरण जनरेटर अंतिम पंक्ति में "missing attribute access on rule scope: nounPhrase" उत्पन्न करता है।

[मैं अभी भी एएनटीएलआर के लिए नया हूं और हालांकि कुछ व्याकरण काम करते हैं, यह अभी भी परीक्षण और त्रुटि है। मुझे अक्सर "आउटऑफमेमरी" त्रुटि मिलती है जब व्याकरण को छोटे से चलाया जाता है - किसी भी मदद का स्वागत है।]

मैं कोड उत्पन्न करने के लिए एएनटीएलआरवर्क्स 1.3 का उपयोग कर रहा हूं और जावा 1.6 के तहत चल रहा हूं। एक बेहतर रास्ता मिल गया के बाद

उत्तर

1

उत्तर देना सवाल ...

WS : (' '|'\t')+; 
TOKEN : (('A'..'Z') | ('a'..'z'))+; 
dttok : 'DT' WS TOKEN; 
nntok : 'NN' WS TOKEN; 
nounPhrase : (dttok WS nntok); 
chunker : nounPhrase ; 

समस्या मैं lexer और पार्सर के बीच अव्यवस्थित हो रही किया गया था (यह जाहिरा तौर पर बहुत आम है)। अपरकेस आइटम लेजरिकल, पार्सर में लोअरकेस हैं। यह अब काम करता प्रतीत होता है। (एनबी मैंने एनपी को एनएन में बदल दिया है)।

2

मूल व्याकरण में, क्यों विशेषता इसके लिए पूछ रहा है, सबसे अधिक संभावना शामिल नहीं:

chunker : nounPhrase {System.out.println("chunk found "+"("+$nounPhrase.text+")");}; 

अपने नियमों से प्रत्येक (chunker एक मैं जल्दी से देखा जा सकता है किया जा रहा है) विशेषताएं (अतिरिक्त जानकारी) उनसे संबंधित नहीं है उनके साथ। http://www.antlr.org/wiki/display/ANTLR3/Attribute+and+Dynamic+Scopes पर विभिन्न प्रकार के नियमों के लिए अलग-अलग विशेषताओं की एक त्वरित सूची मिल सकती है, तो यह अच्छा होगा अगर उन प्रत्येक विशेषताओं के लिए वेब पेज पर विवरण डाले गए हों (जैसे पार्सर नियमों के लिए प्रारंभ और रोक विशेषता के लिए टोकन देखें आपके लेक्सर से - जो आपको अपनी लाइन नंबर और स्थिति पर वापस जाने की अनुमति देगा)।

मुझे लगता है कि $nounPhrase के बजाय आपको अपने चंकर नियम को थोड़ा बदलना चाहिए, आपको $nounPhrase.text का उपयोग करना चाहिए। text आपके nounPhrase नियम के लिए एक विशेषता है।

साथ ही आप एक छोटे से अन्य formating ऐसा करने के लिए, आम तौर पर पार्सर नियम (छोटा अक्षर के साथ शुरू) lexer नियम पहले दिखाई देते हैं चाहते हो सकता है (अपरकेस अक्षर से शुरू)

पी एस। जब मैं बॉक्स में टाइप करता हूं तो चंकर नियम एक नई लाइन पर शुरू होता है लेकिन मेरे मूल उत्तर में यह एक नई लाइन पर शुरू नहीं हुआ।

+0

क्या आप आगे बढ़ सकते हैं, कृपया? मुझे यकीन नहीं है कि एक विशेषता क्या है –

8

"विशेषता का उपयोग लापता" का अर्थ है कि आप एक गुंजाइश ($nounPhrase) के बजाय गुंजाइश (जैसे $nounPhrase.text के रूप में) के एक विशेषता संदर्भित किया है।

सामान्य रूप से, गुणों के साथ समस्याओं का निवारण करने का एक अच्छा तरीका प्रश्न में नियम के लिए जेनरेट की गई पार्सर विधि को देखना है।

उदाहरण के लिए, मेरी एक नया नियम बनाते समय मैं कुछ पुरानी था पर प्रारंभिक प्रयास:

multiple_names returns [List<Name> names] 
@init { 
    names = new ArrayList<Name>(4); 
} 
: a=fullname ' AND ' b=fullname { names.add($a.value); names.add($b.value); }; 

"नियम पूरा नाम के लिए अज्ञात विशेषता" में हुई।इसलिए मैं

multiple_names returns [List<Name> names] 
@init { 
    names = new ArrayList<Name>(4); 
} 
: a=fullname ' AND ' b=fullname { names.add($a); names.add($b); }; 

जिसमें "विशेषता पहुँच लापता" परिणाम की कोशिश की। जेनरेट की गई पार्सर विधि को देखते हुए यह स्पष्ट हो गया कि मुझे क्या करना है। जबकि वहाँ कुछ गुप्त टुकड़े, स्कोप (चर) के लिए प्रासंगिक भागों को आसानी से समझा जाता है:

public final List<Name> multiple_names() throws RecognitionException { 
    List<Name> names = null;  // based on "returns" clause of rule definition 
    Name a = null;     // based on scopes declared in rule definition 
    Name b = null;     // based on scopes declared in rule definition 
    names = new ArrayList<Name>(4); // snippet inserted from `@init` block 

    try { 
     pushFollow(FOLLOW_fullname_in_multiple_names42); 
     a=fullname(); 
     state._fsp--; 
     match(input,189,FOLLOW_189_in_multiple_names44); 
     pushFollow(FOLLOW_fullname_in_multiple_names48); 
     b=fullname(); 
     state._fsp--; 
     names.add($a); names.add($b);// code inserted from {...} block 
    } 
    catch (RecognitionException re) { 
     reportError(re); 
     recover(input,re); 
    } 
    finally { 
     // do for sure before leaving 
    } 
    return names;     // based on "returns" clause of rule definition 
} 

उत्पन्न कोड को देखने के बाद, यह देखने के लिए कि fullname नियम Name वर्ग के उदाहरण लौटा रहा है आसान है, इसलिए क्या मैं इस मामले में जरूरत बस गया था:

multiple_names returns [List<Name> names] 
@init { 
    names = new ArrayList<Name>(4); 
} 
: a=fullname ' AND ' b=fullname { names.add(a); names.add(b); }; 

संस्करण आप अपनी स्थिति में जरूरत अलग हो सकता है, लेकिन आप आम तौर पर तैयार किए गए कोड को देखकर बहुत आसानी से यह पता लगा सकेंगे।

1

अगर आप गलती से $thing.$attribute तुम कहाँ मतलब $thing.attribute की तरह कुछ मूर्ख है, तो आप भी missing attribute access on rule scope त्रुटि संदेश दिखाई देगा। (मुझे पता है कि इस सवाल का जवाब बहुत समय पहले दिया गया था, लेकिन इस बात की थोड़ी सी समस्या किसी और की मदद कर सकती है जो त्रुटि संदेश देखता है!)