最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

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

ANTLR crifan 2511浏览 0评论

【背景】

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

其中:

转载请注明:在路上 » 【整理】antlr v2和antlr v3的语法的差异

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
89 queries in 0.255 seconds, using 22.20MB memory