2011-11-27 18 views

उत्तर

23

नकारात्मक lexer and parser rules के अंदर हो सकता है।

लेक्सर नियमों के अंदर आप पात्रों को अस्वीकार कर सकते हैं, और पार्सर नियमों के अंदर आप टोकन (लेक्सर नियम) को अस्वीकार कर सकते हैं। लेकिन दोनों लेक्सर- और पार्सर नियम क्रमशः एकल वर्ण, या एकल टोकन को अस्वीकार कर सकते हैं।

उदाहरण के एक जोड़े:

lexer नियम

लोअरकेस ascii पत्र को छोड़कर एक या अधिक वर्ण से मेल करने के लिए आप कर सकते हैं:

NO_LOWERCASE : ~('a'..'z')+ ; 

(निषेध-मेटा-चार, ~, + की तुलना में अधिक प्राथमिकता है, इसलिए ऊपर नियम (~('a'..'z'))+ के बराबर है)

ध्यान दें कि 'a'..'z' एक भी अक्षर से मेल खाता (और नकार दिया जा वजह सकता है), लेकिन निम्नलिखित नियम अमान्य है:

ANY_EXCEPT_AB : ~('ab') ; 

क्योंकि 'ab' (जाहिर है) 2 से मेल खाता है, यह नकार नहीं किया जा सकता।

ANY_EXCEPT_AB 
    : 'a' ~'b' // any two chars starting with 'a' followed by any other than 'b' 
    | ~'a' . // other than 'a' followed by any char 
    ; 

पार्सर नियम

अंदर पार्सर नियम, ~ एक निश्चित टोकन, या एक से अधिक को नकारता: नहीं 'ab' निशानी है कि 2 चरित्र के होते हैं मैच के लिए, लेकिन, आप निम्न कार्य करना होगा टोकन। उदाहरण के लिए, आप निम्नलिखित टोकन को परिभाषित किया है:

A : 'A'; 
B : 'B'; 
C : 'C'; 
D : 'D'; 
E : 'E'; 

आप अब A को छोड़कर किसी भी टोकन मिलान करना चाहते हैं, तो आप कार्य करें:

p : ~A ; 

और तुम B को छोड़कर किसी भी टोकन मिलान करना चाहते हैं और D, आप कर सकते हैं:

p : ~(B | D) ; 

हालांकि, अगर आप किसी भी दो A के अलावा अन्य टोकनके बाद मिलान करना चाहते हैं, आप ऐसा नहीं कर सकते हैं:

p : ~(A B) ; 

बस lexer नियमों के साथ के रूप में, आप एक ही टोकन की तुलना में अधिक नकारना नहीं कर सकते।

P 
    : A ~B 
    | ~A . 
    ; 

ध्यान दें कि . (डॉट) एक पार्सर नियमों में चार नहीं मैच किसी भी चरित्र के रूप में यह lexer नियम के अंदर करता है: ऊपर पूरा करने के लिए आपको बस इतना करना। पार्सर नियमों के अंदर, यह किसी भी टोकन से मेल खाता है (A, B, C, D या E, इस मामले में)।

ध्यान दें कि आप पार्सर नियमों को अस्वीकार नहीं कर सकते हैं। निम्नलिखित अवैध है:

p : ~a ; 
a : A ; 
+0

स्पष्टीकरण के लिए धन्यवाद। मुझे पता नहीं था कि एक पार्सर नियम में होने पर '~' ऑपरेटर टोकन पर लागू होगा। – Gunther

+0

@ गुंटर, कोई समस्या नहीं। मैं अक्सर अपने उत्तरों में संक्षेप में इसका जिक्र करता हूं, इसलिए अब से मैं इस क्यू एंड ए से लिंक कर सकता हूं। W.r.t. आपका कनवर्टर, शायद आप पहले से ही इसका उपयोग कर रहे हैं, लेकिन शायद नहीं: 'org.antlr.tool.Strip' वर्ग एएनटीएलआर व्याकरण फ़ाइलों से सभी कस्टम कोड हटा देता है जो एएनटीएलआर व्याकरण को पार्स करते समय आपके जीवन को आसान बना सकता है। –

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