2013-08-23 10 views
5

मैं AnTLR4 में अजगर व्याकरण को लागू कर रहा हूँ, लेकिन मैं मांगपत्र के साथ एक ही समस्या का सामना कर रहा हूँ और DEDENT यहाँ पर चर्चा की: ANTLR4- dynamically inject tokenAnTLR4: मांगपत्र और DEDENT टोकन

समाधान मैं कोशिश कर रहा हूँ टेर द्वारा समाधान कन्वर्ट करने के लिए है कि हो सकता है यहां पाया गया http://antlr3.org/grammar/1078018002577/python.tar.gz (अगला टोकन ओवरराइड करें और काल्पनिक टोकन डालें)।

LEADING_WS 
    : {getColumn()==1}? 
     // match spaces or tabs, tracking indentation count 
     ( ' ' { spaces++; } 
     | '\t' { spaces += 8; spaces -= (spaces % 8); } 
     | '\014' // formfeed is ok 
     )+ 
     { 
     } 
     ... 

लेकिन मुझे एक त्रुटि हो रही है क्योंकि lexer नियम में कार्रवाई एकल altermost विकल्प पर पिछले तत्व होना चाहिए रखें:

समस्या इस समाधान मानता है कि है कि हम की तरह एक lexer नियम है।

क्या कोई मुझे समाधान खोजने में मदद कर सकता है?

बहुत बहुत धन्यवाद !!!

+1

बेशर्म प्लग के लिए क्षमा करें, लेकिन मैं एक ही मुद्दा था और इसके लिए एक सहायक वर्ग लिखने का फैसला किया: [antlr-denter] (https://github.com/yshavit/antlr-denter)। – yshavit

उत्तर

3

आपको spaces से LEADING_WS नियम या nextToken के कार्यान्वयन के अंत में अपनी गणना को स्थानांतरित करने की आवश्यकता है। LEADING_WS के अंत में यह निम्न की तरह दिख सकता है।

LEADING_WS 
    : {getColumn()==1}? 
    // match spaces or tabs, tracking indentation count 
    [ \t]+ 
    {spaces = computeSpaces(_input.getText());} 
    ; 
+0

आपके उत्तर के लिए धन्यवाद। मैं इसे अगली टोकन के ओवरराइड कार्यान्वयन पर लगाने का समाधान कर रहा हूं! – pinker

+0

जिज्ञासा के लिए मैंने आपके द्वारा प्रस्तावित समाधान का परीक्षण किया लेकिन मुझे लगता है कि लेक्सर कार्यों में $ टेक्स्ट की अनुमति नहीं है! क्या मैं इसे सही इस्तेमाल कर रहा हूँ? – pinker

+0

@pinker इसके बारे में खेद है, आपको एएनटीएलआर 4 में '$ टेक्स्ट' के बजाय' _input.getText() 'का उपयोग करना होगा। –

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