【发布时间】:2012-09-02 12:21:23
【问题描述】:
我的任务是创建 ANTLR 语法,分析 C# 源代码文件并生成类层次结构。然后,我将使用它来生成类图。
我编写了解析命名空间、类声明和方法声明的规则。现在我有跳过方法体的问题。我不需要解析它们,因为身体在我的任务中毫无用处。
我写了简单的规则:
body:
'{' .* '}'
;
但它不能正常工作,当方法看起来像:
void foo()
{
...
{
...
}
...
}
规则匹配第一个大括号没问题,然后匹配
...
{
...
as 'any'(.*) 然后第三个大括号作为最后一个大括号,什么不合适,规则结束。
任何人都可以帮助我为方法体编写适当的规则吗?正如我之前所说,我不想解析它们 - 只是跳过。
更新:
这是我的问题的解决方案,强烈基于 Adam12 的回答
body:
'{' ( ~('{' | '}') | body)* '}'
;
【问题讨论】:
-
您将面临一项非常艰巨的任务您必须在正文中接受 { 和 } 对,并且您还必须忽略正文中的 cmets 和 string-content。在生成一小部分 json 或 /* if (...) { something*/ 对于一些临时删除的代码时,像“[{”这样的字符串非常常见,它们会扰乱你的规则。
-
@Casperah,你能给我一些例子如何接受成对的 { } 吗?我认为我应该在这里使用递归,仅此而已