2011-09-24 47 views
5

我已經定義了多個詞法分析規則,它們可能會匹配相同的字符序列。例如:ANTLR中匹配多個詞法規則的字符

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規則仍然正常工作。

這有點令人困惑。是不是這個/,它是/ *的一部分還是隻是一個獨立的/,在它有機會被ML_COMMENT匹配之前,總是會被IGNORED_SYMBOLS匹配和消費?

如果字符匹配多個規則,詞法分析器如何決定應用哪些規則?

回答

4

如果字符匹配多個規則,詞法分析器如何決定應用哪些規則?

Lexer規則從上到下匹配。如果兩個(或更多)規則匹配相同數量的字符,則首先定義的規則優先於稍後在語法中定義的規則。如果規則匹配N字符數並且後面的規則匹配相同的N字符 1個或更多字符,則後面的規則匹配(貪婪匹配)。

看看下面的規則,例如:

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

輸入"do"顯然由規則DO匹配。

而輸入如:"done"會被ID貪婪地匹配。它是而不是被標記爲2個標記:[DO:"do"]其次是[ID:"ne"]

相關問題