2012-11-09 9 views
5

के लिए दूसरा दूसरा विकल्प मैं एक छोटी क्वेरी भाषा के लिए एक एएनटीएलआर व्याकरण लिखने की कोशिश कर रहा हूं।कैच-मेरे शुरुआती नियम

फ़ील्ड 1: एक field2: ख फ़ील्ड 3: ग

जहां फ़ील्ड 1 एक से मेल खाता है संस्थाओं की एक सूची प्रदान करने की अपेक्षा की है कि, बी, और इतने पर field2 से मेल खाता है प्रश्नों एक विशिष्ट क्षेत्रों तक ही सीमित खोज शब्दों की सूची है। प्रश्नों भी पूरी तरह से अप्रतिबंधित हो सकता है:

एबीसी

किसी भी क्षेत्र है कि एबीसी से मेल खाता के साथ संस्थाओं वापस जाने के लिए चाहिए था कि।

@members { 
    String unrestrictedQuery; 
} 

FIELD1_OPERATOR: 'field1:'; 
FIELD2_OPERATOR: 'field2:'; 
FIELD3_OPERATOR: 'field3:'; 
DIGIT: '0'..'9'; 
LETTER: 'A'..'Z' | 'a'..'z'; 

query: subquery (' ' subquery)* 
    | UNRESTRICTED_QUERY=.* {unrestrictedQuery = $UNRESTRICTED_QUERY.text;} 
    ; 

मैं अप्रतिबंधित प्रश्नों ऐसा कोई भी टेक्स्ट क्वेरी नियम का पहला विकल्प से मेल नहीं खाता होना चाहते हैं: यहाँ ANTLR व्याकरण है।

1) क्या दूसरा विकल्प मिलान करने वाले पाठ को पकड़ने का कोई बेहतर तरीका है?

2) जब मैं इसे अपने वेब सर्वर में प्लग करता हूं, तो unrestrictedQuery पार्सर फ़ील्ड क्वेरी के अंतिम अक्षर को हल करता है। ऐसा लगता है कि जब मैं वास्तव में पूरी स्ट्रिंग चाहता हूं तो क्वेरी के प्रत्येक चरित्र के लिए कार्रवाई को बुलाया जाता है।

पढ़ने के लिए धन्यवाद!

+1

'*' 'UNRESTRICTED_QUERY में = *' टोकन की किसी भी राशि से मेल खाता है। यह किसी भी चरित्र की संख्या * से मेल नहीं खाता है! बड़ा अंतर। –

+0

आप बिल्कुल सही हैं। धन्यवाद। –

उत्तर

1

"मैं अप्रतिबंधित प्रश्नों को कोई भी पाठ होना चाहता हूं जो क्वेरी नियम के पहले विकल्प से मेल नहीं खाता"। यह एक खराब डिजाइन निर्णय है। यदि भविष्य में, आप फ़ील्ड 4 जोड़ना चाहते हैं तो क्या होगा? फिर असंगतता होती है। व्याकरण को बेहतर रूप से बदलें ताकि अप्रतिबंधित प्रश्न आसानी से पहचाने जाएं। चारों ओर फ़ील्ड मान (क, ख, ग) उद्धरण के साथ, या एक पेट के साथ अप्रतिबंधित क्वेरी शुरू:।।

field1:a :abc field2:b