【背景】
对于从antlr v2迁移到v3时,所要注意的事项,和对应的语法改动。
官网:
Migrating from ANTLR 2 to ANTLR 3
中已经整理过了。
不过呢,我此处,只是针对个人遇到过的例子,来整理一些,常见的情况的处理:
比如之前从:
http://www.antlr3.org/pipermail/antlr-interest/2004-July/008778.html
找到的antlr v2的,java版本的lexer代码。
其中就有很多对应的需要改变的情况。
下面整理如下:
antlr v2和antlr v3的语法的差异
protected换为fragment
antlr v2:
protected RAW_IDENTIFIER : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')* ;
antlr v3:
fragment RAW_IDENTIFIER : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')* ;
去除newline()
antlr v2:
WS : ( ' ' | '\t' | '\f' | '\n' {newline();} );
antlr v3:
WS : ( ' ' | '\t' | '\f' | '\n' );
$setType(Token.SKIP)就是skip()
注:
官网中,把:
$setType(Token.SKIP);
解释为:
$channel=HIDDEN;
我倒是觉得不合适。
因为hidden和skip,并不是一回事。
需要写代码的人,自己搞清楚,用哪个。
antlr v2:
WS : ( ' ' | '\t' | '\f' | '\n' ) { $setType(Token.SKIP); };
antlr v3:
WS : ( ' ' | '\t' | '\f' | '\n' ) { skip(); };
综合而言,就会涉及很多变动:
比如
antlr v2的代码:
protected MACRO_TEXT : ( '\\'! '\n' {newline();} // escaped newline | ~'\n' )*;
就对应换为
antlr v3的:
fragment
MACRO_TEXT : ( ('\\' '\r'? '\n') | (~('\r'|'\n')) )*;
其中:
- protected变成了fragment
- 无法在lexer(的token)用感叹号,因为此语法只适用于parser中
- 去除newline
转载请注明:在路上 » 【整理】antlr v2和antlr v3的语法的差异