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