1

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

4

2 回答 2

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 c = '"';会破坏它)。当然,所有这些事情都很容易解决。

于 2012-11-12T19:15:10.523 回答
2

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

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

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

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

特伦斯

于 2012-11-12T21:01:10.520 回答