2014-12-04 54 views
0

我們的設置:ANTLR4 - 在詞法分析器中,模式優先於另一個規則的原因是什麼?

parser.g4:

absolute_schema_nodeid : (SLASH identifier)+; 
identifier: IDENTIFIER 

lexer.g4

tokens{ 
    SLASH 
} 

SLASH : '/' ->type(SLASH); 

IDENTIFIER : [a-zA-Z0-9_][a-zA-Z0-9_\-.]* -> pushMode(VALUE_MODE); 

mode VALUE_MODE; 

fragment ESC : '\\' (["\\/bfnrt] | UNICODE) ; 
fragment UNICODE : 'u' HEX HEX HEX HEX ; 
fragment HEX : [0-9a-fA-F] ; 

END_SLASH : '/' ->type(SLASH), popMode; 
STRING: ((~('\r' | '\n' | '\t' | ' ' | ';' | '{' | '"' | '\'' | ':' | '/' | '=' | '[' | ']')~('\r' | '\n' | '\t' | ' ' | ';' | '{' | ':' | '/' | '=' | '[' | ']')*)) ->popMode;// IDENTIFIER ; 

mode BLOCK_COMMENT_MODE; 

測試規則:

/aaa/aaabbb 

我們需要在VALUE_MODE詞法蹦出來的時候它找到'/'(END_SLASH)
爲什麼STRING規則優先於END_SLASH?是什麼原因?

回答

0

好了,它的工作方式如下:

詞法分析器:

RPC_KEYWORD : 'rpc'-> pushMode(VALUE_MODE); 

解析器:

rule1 : RPC_KEYWORD 

rule2 : [a-z]+ 

例1:RPCA

比賽規則2(較長的一個),規則訂單沒關係

例2:RPC

比賽規則1,規則順序事項

0

初讀時,看起來這是操作的順序。你的問題不清楚這是否是你所期望的。

  1. 規則SLASH比賽令牌/
  2. 規則IDENTIFIER比賽令牌aaa
    • 推模式VALUE_MODE
  3. 規則END_SLASH比賽令牌
    • 集令牌類型場
    • 流行模式
  4. 規則IDENTIFIER比賽令牌aaabbb
    • 推模式VALUE_MODE
  5. 文件結束。
+0

什麼你寫的是我們真正想要的,但在現實中 它去STRING的規則,而不是END_SLASH。 所以,我們的問題是一樣的:爲什麼STRING規則優先於END_SLASH? – MartinC 2014-12-05 07:56:29

相關問題