3
我需要计算正确的C#源文件中的类的数量。 我写了下面的语法:计算班级计数的部分语法
grammar CSharpClassGrammar;
options
{
language=CSharp2;
}
@parser::namespace { CSharpClassGrammar.Generated }
@lexer::namespace { CSharpClassGrammar.Generated }
@header
{
using System;
using System.Collections.Generic;
}
@members
{
private List<string> _classCollector = new List<string>();
public List<string> ClassCollector { get { return
_classCollector; } }
}
/*------------------------------------------------------------------
* PARSER RULES
*------------------------------------------------------------------*/
csfile : class_declaration* EOF
;
class_declaration
: (ACCESSLEVEL | MODIFIERS)* PARTIAL? 'class' CLASSNAME
class_body
';'?
{ _classCollector.Add($CLASSNAME.text); }
;
class_body
: '{' class_declaration* '}'
;
/*------------------------------------------------------------------
* LEXER RULES
*------------------------------------------------------------------*/
ACCESSLEVEL
: 'public' | 'internal' | 'protected' | 'private' | 'protected
internal'
;
MODIFIERS
: 'static' | 'sealed' | 'abstract'
;
PARTIAL
: 'partial'
;
CLASSNAME
: ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
;
COMMENT
: '//' ~('\n'|'\r')* {$channel=HIDDEN;}
| '/*' (options {greedy=false;} : .)* '*/' {$channel=HIDDEN;}
;
WHITESPACE
: ('\t' | ' ' | '\r' | '\n'| '\u000C')+ { $channel = HIDDEN; }
;
这个解析器正确计算空类(和嵌套类太)空类体:
internal class DeclarationClass1
{
class DeclarationClass2
{
public class DeclarationClass3
{
abstract class DeclarationClass4
{
}
}
}
}
我需要计算与非空体类,例如作为:
class TestClass
{
int a = 42;
class Nested { }
}
我需要以某种方式忽略所有“不是类声明”的代码。 在上例中忽略
int a = 42;
我该怎么做?可能是其他语言的例子吗?
请帮忙!
请注意部分班级;请注意,部分类可以在一个文件中多次,一次只在一个文件中,或者分散在多个文件中。 Assembly.GetTypes()不是一个选项吗? – 2011-02-06 15:11:10
谢谢,我记得部分课程。 Assembly.GetTypes()不适合我,我需要在源代码级别处理这个。 – 2011-02-06 15:14:08