[antlr-interest] Partial grammar for class counting

Massimiliano Donini maxgbr at hotmail.it
Sun Feb 6 08:22:17 PST 2011


  Hi pavel,
Did you try to use Lexical Filter?
Have a look http://www.antlr.org/wiki/display/ANTLR3/Lexical+filters

Hope it helps
Best Regards Max


Il 06/02/2011 17:04, Pavel Martynov ha scritto:
> Hi!
>
> I need to count the number of classes in correct C# source file. I
> wrote the following grammar:
>
> 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; }
>          ;
>
>
>
> Hi!
>
> I need to count the number of classes in correct C# source file. I
> wrote the following grammar:
>
> 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; }
>          ;
>
> This parser correctly count empty classes (and nested classes too)
> with empty class-body:
>
> internal class DeclarationClass1
> {
>      class DeclarationClass2
>      {
>          public class DeclarationClass3
>          {
>              abstract class DeclarationClass4
>              {
>              }
>          }
>      }
> }
>
> I need to count classes with not empty body, such as:
>
> class TestClass
> {
>      int a = 42;
>
>      class Nested { }
> }
>
> I need to somehow ignore all the code that is "not a class
> declaration". In the example above ignore
>
> int a = 42;
>
> How can I do this? May be example for other language?
> Please, help!
>
>
> --
> with best regards, Pavel Martynov
>
> List: http://www.antlr.org/mailman/listinfo/antlr-interest
> Unsubscribe: http://www.antlr.org/mailman/options/antlr-interest/your-email-address
>
>



More information about the antlr-interest mailing list