【整理】antlr v2和antlr v3的语法的差异

【背景】

对于从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'))
		)*;

其中:



发表评论

电子邮件地址不会被公开。 必填项已用*标注

无觅相关文章插件,快速提升流量