2012-01-26 15 views
5

कृपया यहां उपलब्ध स्रोत कोड देखें: https://gist.github.com/1684022एएनटीएलआर लेक्सर नियम अस्पष्टताओं को हल करने का सही तरीका?

ID : ('a'..'z' | 'A'..'Z') ('0'..'9' | 'a'..'z' | 'A'..'Z' | ' ')*; 

PITCH 
    : (('A'|'a') '#'?) 
    | (('B'|'b') '#'?) 
    | (('C'|'c') '#'?); 

जाहिर है, पत्र 'ए' एक अस्पष्टता होगा:

मैं दो टोकन परिभाषित मिल गया है।

मैं आगे को परिभाषित:

note : PITCH; 
name : ID; 
main : name ':' note '\n'? 

अब, अगर मैं दर्ज करें: पार्सर को इनपुट के रूप में "एक एक", मैं हमेशा कोई त्रुटि मिलती है। या तो पार्सर पिच या आईडी आईडी या पिच पहले परिभाषित किया गया है जो इस पर निर्भर उम्मीद:

mismatched input 'A' expecting ID 

इतना है कि यह अपेक्षित तरीके से काम इस को हल करने के लिए उचित तरीका क्या है?


के रूप में वर्णन किया गया है, हालांकि यह सहज ज्ञान युक्त भावना कैसे पार्स काम करना चाहिए बनाता है, ANTLR "सही बात" नहीं करता है। ऐसा है, भले ही main नियम कहता है कि name/ID पहले आना चाहिए, लेक्सर इस बात से अनजान प्रतीत होता है और "ए" को PITCH के रूप में पहचानता है क्योंकि यह "सबसे लंबा मैच"/"जो पहले आता है" नियम के बजाए अधिक उचित "नियम क्या कहता है" नियम।

क्या आईडी और पिच दोनों से मेल करके नकली/हैक का एकमात्र समाधान है, और फिर बाद में उन्हें पुन: संयोजित करने के रूप में dasblinkenlight कहते हैं?

ID : (('a'..'z' | 'A'..'Z') ('0'..'9' | 'a'..'z' | 'A'..'Z' | ' ')+) 
    | ('d'..'z' | 'D'..'Z'); 

PITCH : 'a'..'c' | 'A'..'C'; 

SHARP : '#'; 

note : PITCH SHARP?; 

name : ID | PITCH; 

main : name ':' note '\n'? EOF 

यह एक चरित्र पिच नाम है, जो "फिर से" मिल पार्सर में से लंबे नामों को अलग करती है:

+0

हां। इस सवाल के साथ अंतरिक्ष को क्या करना है? – Ana

+1

देखो, बार्ट। चाहे मैं एएनटीएलआर को समझूं या नहीं, जिस बिंदु पर आप हथियार रखते हैं, वह अप्रासंगिक है। मैं एक समाधान की तलाश कर रहा हूं जो समझ में आता है और यद्यपि आपने एक उत्तर और चार टिप्पणियां प्रदान की हैं, उनमें से कोई भी समाधान नहीं है, सिर्फ मेरी पोस्ट या मेरी समझ पर टिप्पणी है। यदि आप एएनटीएलआर समझते हैं और आप मेरी समस्या को मेरे से बेहतर समझते हैं, तो एक वास्तविक समाधान पोस्ट करें। – Ana

उत्तर

4

यहाँ मैं कैसे फिर से कारक हैं इस व्याकरण यह काम कर रहा है। इसके अलावा "तेज" टोकन का अपना नाम मिलता है, और पार्सर में वैकल्पिक टोकन के रूप में पहचाना जाता है।

+0

धन्यवाद, dasblinkenlight। इसकी प्रशंसा करना। उम्मीद थी कि एक क्लीनर तरीका था लेकिन यह करेगा। – Ana

+0

@ एना यह एएनटीएलआर का मानक दृष्टिकोण है जो खोजशब्दों के रूप में खोजशब्दों के उपयोग की इजाजत देता है। आपके मामले में, 'पिच' एक "कीवर्ड" की भूमिका निभाता है, जबकि पहचानकर्ता पहचानकर्ता बने रहते हैं। – dasblinkenlight

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