#!/usr/bin/perl -w
use strict;
my ($nt, $nt2, $nt3, $nt4, $nt5, $nt6);
sub qmw {
my $expected1 = shift;
$expected1 =~ s/\s+//g;
$expected1 = quotemeta($expected1);
$expected1 = qr{$expected1};
return $expected1;
}
BEGIN { $nt = 2; $nt2 = 3; $nt3 = 2;
}
use Test::More tests=> $nt + $nt2+$nt3;
# test -S option and PPCR methodology with Pascal range versus enumerated conflict
SKIP: {
skip "t/prueba01.c not found", $nt unless ($ENV{DEVELOPER}
&& -r "t/prueba01.c"
&& -x "./script/usetypes.pl");
my $r = qx{perl -I./lib/ script/usetypes.pl t/prueba01.c 2>&1};
ok(!$@,'t/prueba01.c executed as modulino');
my $expected = q{
Type Error at line 8: Variable 'e' declared with less than 2 dimensions
};
$expected =~ s/\s+//g;
$expected = quotemeta($expected);
$expected = qr{$expected};
$r =~ s/\s+//g;
like($r, $expected,'checking output for prueba01.c');
############################
}
SKIP: {
skip "t/prueba02.c not found", $nt unless ($ENV{DEVELOPER}
&& -r "t/prueba02.c"
&& -x "./script/usetypes.pl");
my $r = qx{perl -I./lib/ script/usetypes.pl t/prueba02.c 1 2>&1};
ok(!$@,'t/prueba02.c executed as modulino');
my $expected1 = qmw q{
1 int a,b,e[10];
2
3 g() {}
4
5 int f(char c) {
6 char d;
7 c = 'X';
8 e[d][b] = 'A'+c;
9 {
10 int d;
11 d = a + b;
12 }
13 c = d * 2;
14 return c;
15 }
16
};
my $expected2 = qmw q{
Type Error at line 8: Variable 'e' declared with less than 2 dimensions
};
$r =~ s/\s+//g;
like($r, $expected1,'checking output for prueba02.c');
like($r, $expected2,'checking err for prueba02.c');
############################
}
SKIP: {
skip "t/prueba03.c not found", $nt unless ($ENV{DEVELOPER}
&& -r "t/prueba03.c"
&& -x "./script/usetypes.pl");
my $r = qx{perl -I./lib/ script/usetypes.pl t/prueba03.c 1 2>&1};
ok(!$@,'t/prueba03.c executed as modulino');
my $expected1 = qmw q{
1 int a,b,e[10];
2
3 g() {}
4
5 int f(char c) {
6 char d;
7 c = 'X';
8 e[d] = 'A'+c;
9 {
10 int d;
11 d = a + b;
12 }
13 a = b * 2;
14 return c;
15 }
16
PROGRAM^{0}(
FUNCTION[g]^{1},
FUNCTION[f]^{2}(
ASSIGNCHAR(
VAR(
TERMINAL[c:7]
),
CHARCONSTANT(
TERMINAL['X':7]
)
),
ASSIGNINT(
VARARRAY(
TERMINAL[e:8],
INDEXSPEC(
CHAR2INT(
VAR(
TERMINAL[d:8]
)
)
)
),
PLUS(
CHAR2INT(
CHARCONSTANT(
TERMINAL['A':8]
)
),
CHAR2INT(
VAR(
TERMINAL[c:8]
)
)
)
),
BLOCK[9:3:f]^{3}(
ASSIGNINT(
VAR(
TERMINAL[d:11]
),
PLUS(
VAR(
TERMINAL[a:11]
),
VAR(
TERMINAL[b:11]
)
)
)
),
ASSIGNINT(
VAR(
TERMINAL[a:13]
),
TIMES(
VAR(
TERMINAL[b:13]
),
INUM(
TERMINAL[2:13]
)
)
),
RETURNINT(
CHAR2INT(
VAR(
TERMINAL[c:14]
)
)
)
)
)
---------------------------
0)
Types:
$VAR1 = {
'A_10(INT)' => bless( {
'children' => [
bless( {
'children' => []
}, 'INT' )
]
}, 'A_10' ),
'F(X_1(CHAR),INT)' => bless( {
'children' => [
bless( {
'children' => [
bless( {
'children' => []
}, 'CHAR' )
]
}, 'X_1' ),
$VAR1->{'A_10(INT)'}{'children'}[0]
]
}, 'F' ),
'CHAR' => $VAR1->{'F(X_1(CHAR),INT)'}{'children'}[0]{'children'}[0],
'VOID' => bless( {
'children' => []
}, 'VOID' ),
'INT' => $VAR1->{'A_10(INT)'}{'children'}[0],
'F(X_0(),INT)' => bless( {
'children' => [
bless( {
'children' => []
}, 'X_0' ),
$VAR1->{'A_10(INT)'}{'children'}[0]
]
}, 'F' )
};
Symbol Table:
$VAR1 = {
'e' => {
'type' => 'A_10(INT)',
'line' => 1
},
'a' => {
'type' => 'INT',
'line' => 1
},
'b' => {
'type' => 'INT',
'line' => 1
},
'g' => {
'type' => 'F(X_0(),INT)',
'line' => 3
},
'f' => {
'type' => 'F(X_1(CHAR),INT)',
'line' => 5
}
};
---------------------------
1)
$VAR1 = {};
---------------------------
2)
$VAR1 = {
'c' => {
'type' => 'CHAR',
'param' => 1,
'line' => 5
},
'd' => {
'type' => 'CHAR',
'line' => 6
}
};
---------------------------
3)
$VAR1 = {
'd' => {
'type' => 'INT',
'line' => 10
}
};
};
$r =~ s/\s+//g;
like($r, $expected1,'checking output for prueba02.c');
############################
}