2014-12-04 75 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

相关问题