में एकाधिक लेक्सर नियमों से मेल खाने वाले वर्ण मैंने कई लेक्सर नियमों को परिभाषित किया है जो संभावित रूप से समान वर्ण अनुक्रम से मेल खाते हैं। उदाहरण के लिए:एएनटीएलआर
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 द्वारा मिलान और उपभोग किया जाएगा?
क्या लेक्सर तय करता है कि कौन से नियम लागू होते हैं यदि वर्ण एक से अधिक नियमों से मेल खाते हैं?