Antlr

2012-12-08 12 views
5

के साथ सिंगल-लाइन सी-स्टाइल टिप्पणियों को पार्स करना मैंने सी-शैली एकल पंक्ति टिप्पणियों को समझने वाली छोटी भाषा के लिए व्याकरण लिखा है, उदाहरण के लिए।Antlr

// this is a comment 

यहाँ, व्याकरण मैं इस भाषा के लिए लिखा था का एक टुकड़ा है antlr v3.0.1 कार्यों के

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

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

यह काफी तरह का उपयोग कर, सिवाय इसके कि जब टिप्पणी लिपि में पिछले है और वहाँ कोई NL/सीआर समाप्त कर रहा है, मैं antlr से (क्रम में) एक कष्टप्रद संदेश मिला:

line 1:20 required (...)+ loop did not match anything at character '<EOF>' 

कैसे मैं इस संदेश से छुटकारा पाने के कर सकते हैं? मैंने (..)+ अभिव्यक्ति को EOF टोकन जोड़ने का प्रयास किया लेकिन यह काम नहीं करता है।

+0

मुझे इस बारे में निश्चित नहीं है, लेकिन अगर नई लाइन वैकल्पिक बनाते हैं तो क्या होता है, यानी आप '+' को '' 'में बदलते हैं? या शायद एक '*'? – nijoakim

+0

लालची विकल्पों को छोड़ने के बारे में क्या (वे केवल + के लिए प्रतीत होते हैं), और प्लस को एक प्रश्न चिह्न में बदलते हैं। –

उत्तर

4

आपको greedy=... विकल्प की आवश्यकता नहीं है: आपको आमतौर पर इसकी आवश्यकता होती है जब आपके पास .* या .+ आपके नियम में होता है। और चूंकि आप पहले से ही अपने WS शासन में छिपा चैनल पर लाइन ब्रेक वर्ण डाल रहे हैं, तो आप इसे अपने SINGLELINE_COMMENT से निकाल सकते हैं:

SINGLELINE_COMMENT 
: '//' ~('\r' | '\n')* {$channel=HIDDEN;} 
; 

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

ठीक काम करता है, धन्यवाद! – insitu

2

सामान्य में, "कोई समाप्त NL" मुद्दे को हल का एक बहुत शामिल होगा इस किनारे की स्थिति को पूरा करने के लिए कष्टप्रद व्याकरण परिवर्तन। इनपुट स्ट्रीम के अंत में केवल एनएल जोड़ने के लिए हमेशा आसान होता है, जिसका अर्थ है कि आप एनएल को समाप्त करने की गारंटी दे सकते हैं और अपने व्याकरण में इसके बारे में चिंता नहीं कर सकते हैं। यूनिक्स इस संबंध में सही है, और विंडोज नहीं है।

आपके विशिष्ट मुद्दे का समाधान नहीं है, लेकिन जिस तरह से आपने मूल रूप से नियम को कोड किया है, इस समस्या का खुलासा करता है।

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