1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
|
package Inline::C::grammar;
use strict;
$Inline::C::grammar::VERSION = '0.30';
sub grammar {
<<'END';
code: part(s) {1}
part: comment
| function_definition
{
my $function = $item[1][0];
$return = 1, last if $thisparser->{data}{done}{$function}++;
push @{$thisparser->{data}{functions}}, $function;
$thisparser->{data}{function}{$function}{return_type} =
$item[1][1];
$thisparser->{data}{function}{$function}{arg_types} =
[map {ref $_ ? $_->[0] : '...'} @{$item[1][2]}];
$thisparser->{data}{function}{$function}{arg_names} =
[map {ref $_ ? $_->[1] : '...'} @{$item[1][2]}];
}
| function_declaration
{
$return = 1, last unless $thisparser->{data}{AUTOWRAP};
my $function = $item[1][0];
$return = 1, last if $thisparser->{data}{done}{$function}++;
my $dummy = 'arg1';
push @{$thisparser->{data}{functions}}, $function;
$thisparser->{data}{function}{$function}{return_type} =
$item[1][1];
$thisparser->{data}{function}{$function}{arg_types} =
[map {ref $_ ? $_->[0] : '...'} @{$item[1][2]}];
$thisparser->{data}{function}{$function}{arg_names} =
[map {ref $_ ? ($_->[1] || $dummy++) : '...'} @{$item[1][2]}];
}
| anything_else
comment: m{\s* // [^\n]* \n }x
| m{\s* /\* (?:[^*]+|\*(?!/))* \*/ ([ \t]*)? }x
function_definition:
rtype IDENTIFIER '(' <leftop: arg ',' arg>(s?) ')' '{'
{[@item[2,1], $item[4]]}
function_declaration:
rtype IDENTIFIER '(' <leftop: arg_decl ',' arg_decl>(s?) ')' ';'
{[@item[2,1], $item[4]]}
rtype: TYPE star(s?)
{
$return = $item[1];
$return .= join '',' ',@{$item[2]} if @{$item[2]};
return undef unless (defined $thisparser->{data}{typeconv}{valid_rtypes}{$return});
}
| modifier(s) TYPE star(s?)
{
$return = $item[2];
$return = join ' ',@{$item[1]},$return
if @{$item[1]} and $item[1][0] ne 'extern';
$return .= join '',' ',@{$item[3]} if @{$item[3]};
return undef unless (defined $thisparser->{data}{typeconv}{valid_rtypes}{$return});
}
arg: type IDENTIFIER {[@item[1,2]]}
| '...'
arg_decl: type IDENTIFIER(s?) {[$item[1], $item[2][0] || '']}
| '...'
type: TYPE star(s?)
{
$return = $item[1];
$return .= join '',' ',@{$item[2]} if @{$item[2]};
return undef unless (defined $thisparser->{data}{typeconv}{valid_types}{$return});
}
| modifier(s) TYPE star(s?)
{
$return = $item[2];
$return = join ' ',@{$item[1]},$return if @{$item[1]};
$return .= join '',' ',@{$item[3]} if @{$item[3]};
return undef unless (defined $thisparser->{data}{typeconv}{valid_types}{$return});
}
modifier: 'unsigned' | 'long' | 'extern'
star: '*'
# IDENTIFIER: /[a-z]\w*/i
IDENTIFIER: /\w+/
TYPE: /\w+/
anything_else: /.*/
END
}
1;
|