2009-08-24 20 views
8

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

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 : '#'; 

, अपने पार्सर नियमों में, आप इसे इस तरह से कर सकते हैं::

उत्तर

8

जैसे अपनी ही बात करने के लिए रंग से अपने lexer फ़ाइल में # ले जाने का प्रयास,

color: HASH (LLETTERS | ALPHANUM)+; 
selector: HASH (ULETTERS | LLETTERS) (ULETTERS | LLETTERS | NUMBERS)*; 

इत्यादि

यह आपको व्याकरणिक रूप से अंतर निर्दिष्ट करने की अनुमति देता है, जिसे मोटे तौर पर वर्णित रूप से वर्णित किया जा सकता है, जो कि व्याख्यात्मक रूप से वर्णित है, जिसे लगभग उपस्थिति के रूप में वर्णित किया जा सकता है। यदि कुछ अर्थ यह है कि यह कहां पर निर्भर करता है, तो उस अंतर को व्याकरण में निर्दिष्ट किया जाना चाहिए, न कि लेक्सर।

ध्यान दें कि रंग और चयनकर्ता काफी समान परिभाषा हैं। लेक्सर्स आमतौर पर मॉड्यूल से एक अलग चरण होते हैं जो इनपुट स्ट्रिंग को व्याकरण में अनुवादित करता है, इसलिए यह एक अस्पष्ट लेक्सिकॉन होना चाहिए (जैसा कि इंगित किया गया था, बीबीबी हेक्स हो सकता है या यह लोअरकेस अक्षर स्ट्रिंग हो सकता है)। इस प्रकार, डेटा वैधता जांच कहीं और करने की जरूरत है।

+0

यह अभी भी काम नहीं करता है। समस्या यह है कि बीबीबी (या जो कुछ भी 0..9 | ए..एफ से शुरू होता है) को हेक्सस्ट्रिंग के रूप में टोकननाइज्ड किया जाएगा। यह #bbb को चयनकर्ता के रूप में मिलान करने से रोक देगा। –

+0

अच्छी तरह से, वास्तव में मैं वहां पीछे था। मेरा मानना ​​है कि चूंकि बीबीबी एक वैध स्ट्रिंग और वैध हेक्सस्ट्रिंग दोनों है, इसलिए आपको सॉफ़्टवेयर-साइड डेटा वैधता जांच करने की आवश्यकता होगी। –

+0

यही वह है जिसे मैं डरता हूं। उम्मीद है कि स्टैक ओवरफ्लो पर यहां एक एंटरर गुरु चल रहा है जो आपको गलत साबित कर सकता है:/ –

2

डिट्टो करने के लिए क्या वॉल्ट कहा, Appendix G. Grammar of CSS 2.1 (अन्य टोकन में अपनी स्थिति के आधार पर) एक HASH या तो एक simple_selector रूप में या एक hexcolor के रूप में पार्स करने के लिए HASH, और फिर लेक्स के लिए कहते हैं।

lexer को परिभाषित करता है टोकन निम्नलिखित ...

"#"{name}  {return HASH;} 

... और व्याकरण निम्नलिखित नियम भी शामिल है ...

hexcolor 
    : HASH S* 
    ; 

simple_selector 
    : element_name [ HASH | class | attrib | pseudo ]* 
    | [ HASH | class | attrib | pseudo ]+ 
    ; 

इसका मतलब है कि व्याकरण पर आधारित एक पार्सर गैर-हेक्स हेक्सालर की अनुमति देगा।

मैं कोड में बाद में एक गैर-हेक्स हेक्सालर का पता लगाऊंगा, जो लेक्सड + पार्सेड सिंटैक्स पेड़ का विश्लेषण/व्याख्या करता है।

+0

हां, मैं उस परिशिष्ट से परिचित हूं। मैं जिस व्याकरण का निर्माण कर रहा हूं उसके लिए मैं अपने स्रोतों में से एक के रूप में उपयोग करता हूं। हालांकि मेरे लिए समस्या का समाधान नहीं करता है :( –

+0

@Erik: क्या आपने http://www.antlr.org/grammar/list –

+0

पर उपलब्ध सीएसएस व्याकरण पर एक नज़र डाली है हां, मैंने एक नज़र डाली है सीएसएस 3 व्याकरण, यह वही त्रुटि दिखाता है। –

0

कई विकल्प से एक निर्णय करने के लिए, ANTLR दो विकल्प,

  • वाक्यात्मक विधेय
  • अर्थ विधेय

यह (css2.1 छ) antlr व्याकरण lib से है:

 
simpleSelector 
    : elementName 
     ((esPred)=>elementSubsequent)* 

    | ((esPred)=>elementSubsequent)+ 
    ; 

esPred 
    : HASH | DOT | LBRACKET | COLON 
    ; 

elementSubsequent 
    : HASH 
    | cssClass 
    | attrib 
    | pseudo 
    ; 

cssClass 
    : DOT IDENT 
    ; 

elementName 
    : IDENT 
    | STAR 
    ; 

यह वाक्य रचनात्मक भविष्यवाणियों के लिए उपयोग किया जाता है। व्याकरण को

लिंक: http://www.antlr.org/grammar/1240941192304/css21.g

0

बस googling द्वारा यहां आया था, और एक अच्छा संसाधन, एक असली implimentation पाया। जो लोग आते हैं और एक पूर्ण सीएसएस एंटरल व्याकरण की खोज करते हैं, उसके लिए this व्याकरण फ़ाइल देखें। यह आपको एक विचार दे सकता है या आप इसका सीधे उपयोग कर सकते हैं।

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