# This is the Pegex grammar for Inline::C # Note: # # Use the following environment variables for dev: # # export PERL_PEGEX_DEBUG=1 # export PERL_PEGEX_AUTO_COMPILE=1 # # To recompile the grammar without AUTO COMPILE, just run: # # perl -Ilib -MInline::C::ParsePegex::Grammar=compile # # And that will put changes to this file into Inline::C::ParsePegex::Grammar. %grammar inline-c %version 0.0.1 # C code is 1 or more 'parts' code: part+ # The only parts we care about are function definitions and declarations, but # not those inside a comment. part: =ALL ( | comment | function_definition | function_declaration | anything_else ) comment: /- SLASH SLASH [^ BREAK ]* BREAK / | /- SLASH STAR (: [^ STAR ]+ | STAR (! SLASH))* STAR SLASH ([ TAB ]*)? / # int foo_ () { return -1; }\n function_definition: rtype /( identifier )/ - LPAREN arg* % COMMA /- RPAREN - LCURLY -/ function_declaration: rtype /( identifier )/ - LPAREN arg_decl* % COMMA /- RPAREN - SEMI -/ rtype: /- (: rtype1 | rtype2 ) -/ rtype1: / modifier*( type_identifier ) - ( STAR*) / rtype2: / modifier+ STAR*/ arg: /(: type - ( identifier)|( DOT DOT DOT ))/ arg_decl: /( type WS* identifier*| DOT DOT DOT )/ type: / WS*(: type1 | type2 ) WS* / type1: / modifier*( type_identifier ) WS*( STAR* )/ type2: / modifier* STAR* / modifier: /(: (:unsigned|long|extern|const)\b WS* )/ identifier: /(: WORD+ )/ type_identifier: /(: WORD+ )/ anything_else: / ANY* (: EOL | EOS ) /