ANTLR:消除混乱

时间:2012-11-12 17:00:41

标签: antlr antlr3

我正在学习ANTLR。比方说,我有一个VHDL代码,并希望对PROCESS块进行一些处理。其余的应该被完全忽略。我不想描述整个VHDL语言,因为我只对进程块感兴趣。所以我可以编写一个匹配进程块的规则。但是,如何告诉ANTLR只匹配进程阻止规则并忽略其他任何内容?

2 个答案:

答案 0 :(得分:3)

我知道旁边没有VHDL,所以假设您想用多行注释替换(Java)源文件中的所有单行注释:

//foo

应该成为:

/* foo */

当然,你需要让词法分析器匹配单行注释。但是您还应该确保它能够识别多行注释,因为您不希望//bar被识别为单行注释:

/*
//bar
*/

字符串文字也是如此:

String s = "no // comment";

最后,你应该在词法分析器中创建一些匹配任何角色的全能规则。

快速演示:

grammar T;

parse
 : (t=. {System.out.print($t.text);})* EOF
 ;

Str
 : '"' ('\\' . | ~('\\' | '"'))* '"'
 ;

MLComment
 : '/*' .* '*/'
 ;

SLComment
 : '//' ~('\r' | '\n')*
   {
     setText("/* " + getText().substring(2) + " */");
   }
 ;

Any
 : . // fall through rule, matches any character
 ;

如果你现在解析这样的输入:

//comment 1
class Foo {

  //comment 2

  /* 
   * not // a comment
   */
  String s = "not // a // comment"; //comment 3
}

以下内容将打印到您的控制台:

/* comment 1 */
class Foo {

  /* comment 2 */

  /* 
   * not // a comment
   */
  String s = "not // a // comment"; /* comment 3 */
}

请注意,这只是一个快速演示:Java中的字符串文字可能包含Unicode转义,我的演示不支持,我的演示也不处理char-literals(char literal char c = '"';会打破它)。当然,所有这些都很容易解决。

答案 1 :(得分:2)

在即将发布的ANTLR v4中,您可以进行模糊解析。看看

http://www.antlr.org/wiki/display/ANTLR4/Wildcard+Operator+and+Nongreedy+Subrules

您可以在此处获取测试版软件:

http://antlr.org/download/antlr-4.0b3-complete.jar

特伦斯