जब पार्सर को पता नहीं होता है कि डिफ़ॉल्ट व्यवहार टर्मिनल पर संदेशों को प्रिंट करने के लिए क्या करना है:
लाइन 1:23 '' 'पर DECIMAL लापता
यह एक अच्छा संदेश है, लेकिन गलत जगह है। मैं इसे अपवाद के रूप में प्राप्त करना चाहता हूं।
मैं का उपयोग करने की कोशिश की है BailErrorStrategy
, लेकिन यह ParseCancellationException
एक संदेश के बिना फेंकता है (एक के कारण)InputMismatchException
, एक संदेश के बिना भी)।
क्या कोई ऐसा तरीका है जो मुझे संदेश में उपयोगी जानकारी को बनाए रखते हुए अपवादों के माध्यम से त्रुटियों की रिपोर्ट करने के लिए मिल सकता है?
यहाँ मैं वास्तव में क्या कर रहा हूँ - मैं आमतौर पर एक वस्तु बनाने के लिए नियमों में क्रियाओं का उपयोग करता हूँ:
dataspec returns [DataExtractor extractor]
@init {
DataExtractorBuilder builder = new DataExtractorBuilder(layout);
}
@after {
$extractor = builder.create();
}
: first=expr { builder.addAll($first.values); } (COMMA next=expr { builder.addAll($next.values); })* EOF
;
expr returns [List<ValueExtractor> values]
: a=atom { $values = Arrays.asList($a.val); }
| fields=fieldrange { $values = values($fields.fields); }
| '%' { $values = null; }
| ASTERISK { $values = values(layout); }
;
जब मैं पार्सर का आह्वान करता हूं तो मैं ऐसा कुछ करता हूं:
public static DataExtractor create(String dataspec) {
CharStream stream = new ANTLRInputStream(dataspec);
DataSpecificationLexer lexer = new DataSpecificationLexer(stream);
CommonTokenStream tokens = new CommonTokenStream(lexer);
DataSpecificationParser parser = new DataSpecificationParser(tokens);
return parser.dataspec().extractor;
}
मैं वास्तव में चाहता हूँ
dataspec()
जब इनपुट को पार्स नहीं किया जा सकता है तो कॉल को अपवाद (आदर्श रूप से एक चेक किया गया) को फेंकने के लिए- उस अपवाद के लिए एक उपयोगी संदेश है और लाइन नंबर और स्थिति तक पहुंच प्रदान करें जहां समस्या पाई गई थी
फिर मैं उस अपवाद को कॉलस्टैक तक पहुंचा दूंगा जहां से उपयोगकर्ता के लिए एक उपयोगी संदेश प्रस्तुत करना सबसे उपयुक्त होगा - उसी तरह मैं एक गिरा हुआ नेटवर्क कनेक्शन संभालूंगा, एक भ्रष्ट फ़ाइल पढ़ना, आदि।
मैंने देखा कि एएनटीएलआर 4 में अब क्रियाओं को "उन्नत" माना जाता है, इसलिए शायद मैं अजीब तरीके से चीजों के बारे में जा रहा हूं, लेकिन मैंने इस पर ध्यान नहीं दिया कि ऐसा करने के लिए "गैर-उन्नत" तरीका क्या होगा? हमारी जरूरतों के लिए अच्छा काम कर रहा है।