कृपया यहां उपलब्ध स्रोत कोड देखें: 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
यह एक चरित्र पिच नाम है, जो "फिर से" मिल पार्सर में से लंबे नामों को अलग करती है:
हां। इस सवाल के साथ अंतरिक्ष को क्या करना है? – Ana
देखो, बार्ट। चाहे मैं एएनटीएलआर को समझूं या नहीं, जिस बिंदु पर आप हथियार रखते हैं, वह अप्रासंगिक है। मैं एक समाधान की तलाश कर रहा हूं जो समझ में आता है और यद्यपि आपने एक उत्तर और चार टिप्पणियां प्रदान की हैं, उनमें से कोई भी समाधान नहीं है, सिर्फ मेरी पोस्ट या मेरी समझ पर टिप्पणी है। यदि आप एएनटीएलआर समझते हैं और आप मेरी समस्या को मेरे से बेहतर समझते हैं, तो एक वास्तविक समाधान पोस्ट करें। – Ana