2016-01-05 14 views
7

मेरे पास / एक लेक्सर/पार्सर के लिए .g4 व्याकरण है, जहां लेक्सर लाइन निरंतर टोकन छोड़ रहा है - उन्हें छोड़कर उन्हें पार्सर तोड़ना नहीं है और यह विकल्प नहीं है। यहाँ प्रश्न में lexer नियम है:अनइंडेंट कोड मेरे व्याकरण को तोड़ता है

LINE_CONTINUATION : ' ' '_' '\r'? '\n' -> skip; 

समस्या यह खड़ी कर रहा है, कि जब भी एक निरंतर लाइन स्तंभ 1 से शुरू, पार्सर ऊपर चल रही है है:

Sub Test() 
Debug.Print "Some text " & _ 
vbNewLine & "Some more text"  
End Sub 

मैंने सोचा था कि "अरे मुझे पता है! मैं अंडरस्कोर से पहले एक अतिरिक्त व्हाइटस्पेस डालने के लिए एएनटीएलआर को खिला रहा हूं, और इसे स्वीकार करने के लिए व्याकरण को बदल दूंगा! "

तो मैं इस तरह नियम बदल दिया है:

LINE_CONTINUATION : WS? WS '_' NEWLINE -> skip; 
NEWLINE : WS? ('\r'? '\n') WS?; 
WS : [ \t]+; 

... और परीक्षण कोड ऊपर मुझे इस पार्सर त्रुटि दिया:

extraneous input 'vbNewLine' expecting WS

के लिए अब मेरी एकमात्र समाधान बताने के लिए है मेरी उपयोगकर्ता अपने कोड को सही ढंग से इंडेंट करने के लिए। क्या कोई तरीका है कि मैं उस व्याकरण नियम को ठीक कर सकता हूं?

(Full VBA.g4 grammar file on GitHub)

+0

आप LINE_CONTINUATION को WS में क्यों विलय नहीं करते? –

+0

@IraBaxter 'WS' का उपयोग कई अन्य स्थानों में किया जाता है। आपका क्या अर्थ है? –

+1

आप मूल रूप से सफेद निरंतरता की तरह सफेद निरंतरता चाहते हैं। ठीक है, तो डब्ल्यूएस टोकन के लिए लाइन निरंतरता के व्याख्यात्मक परिभाषा जोड़ें। –

उत्तर

4

आप मूल रूप से चाहते हैं लाइन निरंतरता खाली स्थान के तरह व्यवहार किया जाना।

ठीक है, तो डब्ल्यूएस टोकन को लाइन निरंतरता की शब्दावली परिभाषा जोड़ें। फिर डब्ल्यूएस लाइन निरंतरता उठाएगा, और आपको कहीं भी LINECONTINUATION की आवश्यकता नहीं है।

//LINE_CONTINUATION : ' ' '_' '\r'? '\n' -> skip; 
NEWLINE : WS? ('\r'? '\n') WS?; 
WS : ([ \t]+)|(' ' '_' '\r'? '\n'); 
+0

मैं शापित हो जाऊंगा। इसने काम कर दिया! –

+0

बहुत तेजी से स्पोक। यह काम करता है .... * ओपी * में विशिष्ट मामले के लिए - इसलिए मैंने 'डब्ल्यूएस' नियम को 'डब्लूएसएस' में बदलने की कोशिश की: [\ t] + ('_' '\ r'? '\ N') ?; ', और अब यह अजीब चीज़ों का काम करता है और समर्थन करता है जैसे' विकल्प बेस 1 'को' विकल्प _ \ r \ n बेस \ \ r \ n1' में विभाजित किया जा रहा है, जो कि कमाल है - लेकिन जब भी एक निरंतर लाइन में कोई इंडेंटेशन होता है तो यह टूट जाता है और मैं नहीं करता समझ में नहीं आता है, क्योंकि परिभाषा के रूप में मैं समझता हूं * यह * एक या अधिक स्थान/टैब से मेल खाना चाहिए ... एक सुराग मिला? –

+1

मुझे लगता है कि मैंने चीजों को अलग-अलग परिभाषित किया होगा: HWS = [\ t \] +; अंतराल = \ आर? \ N; NEWLINE = एचडब्ल्यूएस? अंतिम रेखा; डब्ल्यूएस = एचडब्ल्यूएस (अंतराल एचडब्ल्यूएस?)? ; यह आखिरी बिट आपके "निरंतर लाइन इंडेंटेशन" है। शेष समझना आसान बनाने के लिए सिर्फ फैक्टरिंग है। (एचडब्ल्यूएस == "क्षैतिज सफेद स्थान")। –

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