मैं एएनटीएलआर का उपयोग कर सीएसएस, या कम से कम मूल बातें पार्स करने की कोशिश कर रहा हूं। हालांकि मैं अपने लेक्सर नियमों के साथ कुछ समस्याओं में भाग रहा हूं। समस्या एक आईडी चयनकर्ताओं और हेक्साडेसिमल रंग मानों के बीच अस्पष्टता में निहित है। क्योंकिएएनटीएलआर के साथ सीएसएस पार्सिंग - एज केस
ALPHANUM : ('a'..'z' | '0'..'9')+;
COLOR : '#' ('0'..'9' | 'a'..'f')+;
यह काम नहीं करेगा:
#bbb {
color: #fff;
}
और निम्नलिखित पार्सर नियम:
ruleset : selector '{' property* '}';
selector: '#' ALPHANUM;
property: ALPHANUM ':' value ';' ;
value: COLOR;
और इन lexer टोकन स्पष्टता के लिए एक सरल व्याकरण का उपयोग करना, निम्न इनपुट पर विचार # बीबीबी को रंग टोकन के रूप में टोकननाइज्ड किया गया है, भले ही इसे एक चयनकर्ता माना जाता है। यदि मैं हेक्साडेसिमल चरित्र से शुरू नहीं करने के लिए चयनकर्ता को बदलता हूं, तो यह ठीक काम करता है। मुझे यकीन नहीं है कि इसे कैसे हल किया जाए। क्या एएनटीएलआर को एक विशिष्ट टोकन के रूप में केवल एक टोकन टोकन के रूप में इलाज करने का कोई तरीका है यदि यह किसी निश्चित स्थिति में है? कहें, अगर यह एक संपत्ति नियम में है, तो मैं सुरक्षित रूप से यह एक रंग टोकन मान सकता हूं। यदि यह नहीं है, तो इसे एक चयनकर्ता के रूप में मानें।
किसी भी मदद की सराहना की जाएगी!
समाधान: बाहर कर देता है मैं व्याकरण, जो मैं शायद कोड में एएसटी उपयोग करने के साथ सौदा करना चाहिए में बहुत ज्यादा काम करने की कोशिश कर रहा था। सीएसएस में अलग-अलग टोकन में भरोसेमंद रूप से विभाजित होने के लिए बहुत से अस्पष्ट टोकन हैं, इसलिए अब जिस दृष्टिकोण का उपयोग कर रहा हूं वह मूल रूप से '#', '।', ':' और 'घुंघराले ब्रेसिज़' जैसे विशेष पात्रों को टोकन कर रहा है, और पोस्ट प्रोसेसिंग में उपभोक्ता कोड बहुत बेहतर काम करता है, और किनारे के मामलों से निपटना आसान है। तब
LLETTERS: ('a'..'z')
ULETTERS: ('A'..'Z')
NUMBERS: ('0'..'9')
HASH : '#';
, अपने पार्सर नियमों में, आप इसे इस तरह से कर सकते हैं::
यह अभी भी काम नहीं करता है। समस्या यह है कि बीबीबी (या जो कुछ भी 0..9 | ए..एफ से शुरू होता है) को हेक्सस्ट्रिंग के रूप में टोकननाइज्ड किया जाएगा। यह #bbb को चयनकर्ता के रूप में मिलान करने से रोक देगा। –
अच्छी तरह से, वास्तव में मैं वहां पीछे था। मेरा मानना है कि चूंकि बीबीबी एक वैध स्ट्रिंग और वैध हेक्सस्ट्रिंग दोनों है, इसलिए आपको सॉफ़्टवेयर-साइड डेटा वैधता जांच करने की आवश्यकता होगी। –
यही वह है जिसे मैं डरता हूं। उम्मीद है कि स्टैक ओवरफ्लो पर यहां एक एंटरर गुरु चल रहा है जो आपको गलत साबित कर सकता है:/ –