2011-09-24 20 views
5

में एकाधिक लेक्सर नियमों से मेल खाने वाले वर्ण मैंने कई लेक्सर नियमों को परिभाषित किया है जो संभावित रूप से समान वर्ण अनुक्रम से मेल खाते हैं। उदाहरण के लिए:एएनटीएलआर

LBRACE: '{' ; 
RBRACE: '}' ; 
LPARENT: '(' ; 
RPARENT: ')' ; 
LBRACKET: '[' ; 
RBRACKET: ']' ; 
SEMICOLON: ';' ; 
ASTERISK: '*' ; 
AMPERSAND: '&' ; 

IGNORED_SYMBOLS: ('!' | '#' | '%' | '^' | '-' | '+' | '=' | 
        '\\'| '|' | ':' | '"' | '\''| '<' | '>' | ',' | '.' |'?' | '/' ) ; 


// WS comments***************************** 
WS: (' '|'\n'| '\r'|'\t'|'\f')+ {$channel=HIDDEN;}; 
ML_COMMENT: '/*' .* '*/' {$channel=HIDDEN;}; 
SL_COMMENT: '//' .* '\r'? '\n' {$channel=HIDDEN;}; 

STRING_LITERAL: '"' (STR_ESC | ~('"'))* '"'; 
fragment STR_ESC: '\\' '"' ; 

CHAR_LITERAL : '\'' (CH_ESC | ~('\'')) '\'' ; 
fragment CH_ESC : '\\' '\''; 

मेरे IGNORED_SYMBOLS और ASTERISK मैच /, "। और * क्रमशः के बाद से वे मेरी टिप्पणी और स्ट्रिंग शाब्दिक नियमों से पहले (अनजाने) रखा रहे हैं जो भी मेल खाते हैं/* और", मैं टिप्पणी की उम्मीद और स्ट्रिंग शाब्दिक नियम अक्षम कर दिए जाएंगे (अनजाने में)। लेकिन आश्चर्य की बात है, ML_COMMENT, SL_COMMENT और STRING_LITERAL नियम अभी भी सही तरीके से काम करते हैं।

यह कुछ हद तक भ्रमित है। क्या यह नहीं है कि, क्या यह/* या सिर्फ एक स्टैंडअलोन/का हिस्सा है, हमेशा एमजी_Cओएममेंट द्वारा मेल खाने का कोई मौका मिलने से पहले IGNORED_SYMBOLS द्वारा मिलान और उपभोग किया जाएगा?

क्या लेक्सर तय करता है कि कौन से नियम लागू होते हैं यदि वर्ण एक से अधिक नियमों से मेल खाते हैं?

उत्तर

4

क्या लेक्सर तय करता है कि कौन से नियम लागू होते हैं यदि वर्ण एक से अधिक नियमों से मेल खाते हैं?

लेक्सर नियम शीर्ष से नीचे से मेल खाते हैं। यदि दो (या अधिक) नियम समान वर्णों से मेल खाते हैं, तो पहले जिसे परिभाषित किया गया है, उसे पहले व्याकरण में परिभाषित किया गया है। यदि कोई नियम N वर्णों की संख्या से मेल खाता है और बाद का नियम उसी N वर्ण प्लस 1 या अधिक वर्णों से मेल खाता है, तो बाद का नियम मेल खाता है (लालची मैच)।

उदाहरण के लिए निम्नलिखित नियम लें:

DO : 'do'; 
ID : 'a'..'z'+; 

इनपुट "do" स्पष्ट रूप से नियम DO से मिलान किया जाएगा।

और इनपुट जैसे: "done" लालसा से ID से मिलान किया जाएगा। यह 2 टोकन के रूप में टोकननाइज्ड है: [DO:"do"][ID:"ne"] के बाद।

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